preg_replace на булет към li

embaka

Registered
Здравейте,

трябва ми от текст, в който се съдържа

•  Speck CandyShell Case 
• Цвят:  бял
• В наличност
• Производител: 
Speck 
• Модел: 
CandyShell Grip Case 
• Фабричен номер:
§bull; Качествен двуслоен хибриден кейс предоставящ висока степен на защита за 

• и текста след него да се замини от <li>текстра след •</li>, като се измахат също и празните места   или space отпред и отзад в <li>

<li>Speck CandyShell Case</li>
<li>Цвят: бял</li>

Надявам се да сте ме разбрали и благодаря.
 
Код:
$str = "•  Speck CandyShell Case 
• Цвят:  бял ";
$arr = explode('•', $str);
unset($arr[0]);
foreach($arr as $str) {
	$str = trim(str_replace(' ','',$str));
	echo '<li>'.$str.'</li>';
}
 
Аз мислех, че всички започват с • :D
Твоето ми харесва повече :?:

@embaka ако имаш \n може да разделяш по тях
 
PHP:
$input = str_replace(' ',  ' ', $input);
$input = str_replace('  ',      ' ', $input);
$input = str_replace("\n",      '',  $input);

$rows = array();

foreach(explode('•', $input) as $row) {
    if(strlen($row) === 0) 
        continue;

    $rows[] = '<li>'.trim($row).'</li>';
}
 
Искам так където се срещне bull, да го направи с отварящ и затварящ li а между тях текста който е след bull
 
Ами имаш 3-4 решения в тази тема, които правят точно това... :roll:
 
Мисля, че съм написал как искам да е с preg_replace с регулярен израз. Аз ли не съм ясен или някой не е разбрал. Парсването мога и сам да си го направя, но това не е решение.
 
Решението, което съм ти дал, до колкото го тествах работи както искаш.
Би ли обяснил как точно се разминава с вижданията ти + пример?
 
нищо общо няма с вижданията ми,

никъде не се затваря </li> тага имаш отварящ таг с нещо напълно безмислено

може би нещо подобно, но и това не е решение, трябва да се случва в един preg_replace

PHP:
$test = str_replace(' ', '', $string);
$test = preg_replace('/(\r\n|\r|\n)+/', "</li>", $test)."\n";
$test = preg_replace("#•#", "<li>", $test);
$test = preg_replace('/\s+/', ' ', $test);
 
Не знам какъв интерпретатор ползваш, това е резултатът с PHP 5.6.19

Код:
 ~ php li.php 
array(7) {
  [0]=>
  string(30) "<li>Speck CandyShell Case</li>"
  [1]=>
  string(25) "<li>Цвят: бял</li>"
  [2]=>
  string(30) "<li>В наличност</li>"
  [3]=>
  string(40) "<li>Производител: Speck</li>"
  [4]=>
  string(41) "<li>Модел: CandyShell Grip Case</li>"
  [5]=>
  string(37) "<li>Фабричен номер:</li>"
  [6]=>
  string(142) "<li>Качествен двуслоен хибриден кейс предоставящ висока степен на защита за</li>"
}

А това че искаш да е с 1 регулярен израз - ок :)
П.С. Парсването е решение! ...едно от.
 
php 5.3.3 ползвам към момента, решението искам да е само с preg_replace, възможно с един ред код
 
embaka каза:
php 5.3.3 ползвам към момента, решението искам да е само с preg_replace, възможно с един ред код
Така:
PHP:
$input = str_replace(' ',  ' ', $input); $input = str_replace('  ',      ' ', $input); $input = str_replace("\n",      '',  $input); $rows = array(); foreach(explode('•', $input) as $row) { if(strlen($row) === 0) continue; $rows[] = '<li>'.trim($row).'</li>'; }
 
<li> таг-а се затваря автоматично. Не може да имаш един <li> таг в друг такъв. Този код
HTML:
<ul>
<li>One
<li>Two</li>
Three</li>
</ul>
Става
HTML:
<ul>
<li>One</li>
<li>Two</li>
Three
</ul>

Затова, когато кода намери следващия • и се опита да отвори нов <li> таг, първо ще затвори предишния.
 
uphero каза:
embaka каза:
php 5.3.3 ползвам към момента, решението искам да е само с preg_replace, възможно с един ред код
Така:
PHP:
$input = str_replace(' ',  ' ', $input); $input = str_replace('  ',      ' ', $input); $input = str_replace("\n",      '',  $input); $rows = array(); foreach(explode('•', $input) as $row) { if(strlen($row) === 0) continue; $rows[] = '<li>'.trim($row).'</li>'; }

човек като писах, че искам да е на 1 ред нямах предвид да се сбие кода и да се направи на един ред, а да е изцяло с един ред с preg_replace само без всички останали неща
 
Понеже не се помъчихте грам да се опитате да го направите както на мен ми трябваше, ще взема да споделя написаното от мен

PHP:
preg_replace('/(\s•\s|\s•\s|\s§bull;\s)(.*?)(\r\n|\r|\n|$)/s', "<li>\\2</li>", $str);
 
Можеш малко да го опростиш:

(\s•\s|\s•\s|\s§bull;\s)(.*?)(\r\n|\r|\n|$)
\s([&§]bull;|•)\s([^\n\r]+)

PHP:
preg_replace('/\s([&§]bull;|•)\s([^\n\r]+)/s', '<li>\2</li>', $str)

https://regex101.com/r/aK3tW8/6

Ако искаш можеш да направиш групите non-capturing с ?: пред първите две и да ползваш \1, но не мисля, че има някакво значение, тъй като ползваш preg_replace и не те интересуват другите capturing groups.

PHP:
preg_replace('/\s(?:[&§]bull;|•)\s([^\n\r]+)/s', '<li>\1</li>', $str)

https://regex101.com/r/aK3tW8/5
 
Да и това е вариянт, ще ми свърши идеална работа, въпреки, че моя вариянт върши работа :) мерси все пак

anonimen каза:
Можеш малко да го опростиш:

(\s•\s|\s•\s|\s§bull;\s)(.*?)(\r\n|\r|\n|$)
\s([&§]bull;|•)\s([^\n\r]+)

PHP:
preg_replace('/\s([&§]bull;|•)\s([^\n\r]+)/s', '<li>\2</li>', $str)

https://regex101.com/r/aK3tW8/6

Ако искаш можеш да направиш групите non-capturing с ?: пред първите две и да ползваш \1, но не мисля, че има някакво значение, тъй като ползваш preg_replace и не те интересуват другите capturing groups.

PHP:
preg_replace('/\s(?:[&§]bull;|•)\s([^\n\r]+)/s', '<li>\1</li>', $str)

https://regex101.com/r/aK3tW8/5
 

Горе