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

C++ JAVA
User avatar
djman
Гуру
Гуру
Posts: 2796
Joined: Sat Sep 12, 2009 8:07 am
Answers: 107

Post by djman » Mon Mar 21, 2016 6:44 pm

Не знам какъв интерпретатор ползваш, това е резултатът с PHP 5.6.19

Code: Select all

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

User avatar
embaka
Гуру
Гуру
Posts: 2045
Joined: Sun May 04, 2008 8:43 pm
Answers: 105
Location: В. Търново
Contact:

Post by embaka » Mon Mar 21, 2016 7:31 pm

php 5.3.3 ползвам към момента, решението искам да е само с preg_replace, възможно с един ред код

uphero
Потребител
Потребител
Posts: 740
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 32
Location: Казанлък
Contact:

Post by uphero » Mon Mar 21, 2016 8:41 pm

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

User avatar
SVTerziev
Нов
Нов
Posts: 158
Joined: Fri Jul 13, 2012 12:32 am
Answers: 34

Post by SVTerziev » Tue Mar 22, 2016 12:41 am

<li> таг-а се затваря автоматично. Не може да имаш един <li> таг в друг такъв. Този код
[html]<ul>
<li>One
<li>Two</li>
Three</li>
</ul>[/html]
Става
[html]<ul>
<li>One</li>
<li>Two</li>
Three
</ul>[/html]

Затова, когато кода намери следващия &bull; и се опита да отвори нов <li> таг, първо ще затвори предишния.

User avatar
embaka
Гуру
Гуру
Posts: 2045
Joined: Sun May 04, 2008 8:43 pm
Answers: 105
Location: В. Търново
Contact:

Post by embaka » Fri Mar 25, 2016 1:06 pm

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

User avatar
embaka
Гуру
Гуру
Posts: 2045
Joined: Sun May 04, 2008 8:43 pm
Answers: 105
Location: В. Търново
Contact:

Post by embaka » Sat Mar 26, 2016 2:01 pm

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

[php]preg_replace('/(\s&bull;\s|\s•\s|\s§bull;\s)(.*?)(\r\n|\r|\n|$)/s', "<li>\\2</li>", $str);[/php]

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1562
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Sat Mar 26, 2016 6:30 pm

Можеш малко да го опростиш:
(\s&bull;\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)[/php]

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)[/php]

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

User avatar
embaka
Гуру
Гуру
Posts: 2045
Joined: Sun May 04, 2008 8:43 pm
Answers: 105
Location: В. Търново
Contact:

Post by embaka » Tue Apr 05, 2016 7:36 am

Да и това е вариянт, ще ми свърши идеална работа, въпреки, че моя вариянт върши работа :) мерси все пак
anonimen wrote:Можеш малко да го опростиш:
(\s&bull;\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)[/php]

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)[/php]

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

Post Reply