Предварительная замена на предварительную замену всех


Кто-то был достаточно любезен, чтобы помочь мне с регулярным выражением для очень специфического использования, но моя единственная проблема сейчас заключается в том, что регулярное выражение заменяет только один экземпляр соответствия, а не все совпадения (что и является целью).

Я хотел бы каждый экземпляр <SPAN> с классом "стильная синяя кнопка", найденным здесь:

<span class="stylish-blue-button">
   <span style="display:none;">[data-user="12345" data-userId="678910"]</span>
     John Smith
   <span style="display:none;">[/]</span>
</span>
...Blablabla some other text...

Чтобы стать таким:

[data-user="12345" data-userId="678910"]John Smith[/] ...Blablabla some other text...

Для этого мне было предоставлено следующее preg_replace:

preg_replace('~\[(data-user="\d+")\h+(data-userId="\d+")\]\s*(.+?)\s*\[/\]\s*(.*)~s', '<span $1 $2>$3</span>$4', trim(strip_tags($string)));

Теперь это работает, и это замечательно, но это заменяет только один экземпляр.

Вопрос: Должен ли я радикально изменить/изменить свой подход для этого, или это будет небольшая модификация?

Большое вам спасибо.

Author: Justin01, 2015-10-27

2 answers

$regex = '~\[(data-user="\d+")\s+(data-userId="\d+")\]\s*(.+?)\s*\[\/\]\s*(.*)~is';

while (preg_match($regex, $string)) {
    $string = preg_replace($regex, "&lt;span $1 $2&gt;$3&lt;/span&gt;$4", trim(strip_tags($string)));
}

echo $string;
 2
Author: Mayur Koshti, 2015-10-27 07:02:11

Попробуйте выполнить функцию preg_match_all (http://php.net/preg_match_all ). Я надеюсь, что это так просто.

 0
Author: Marcus, 2015-10-27 06:35:11