regex — PHP Regexp с дефисом и амперсандом не работает

вот строка:

$test =  '<a id="test">One &amp; -Two&nbsp;-&nbsp;Three</a>';

И я хотел бы поймать эти две строки в переменную 2 дифференциала, как:

$string1 = 'One &amp; -Two';

а также

$string2 = 'Three';

Поэтому я использую preg_match_all, но у меня есть проблема с регулярным выражением:

preg_match_all('#([-;\w\ \.\/\'\d\(\)\&]+)+&nbsp;-&nbsp;([\w+\ \.\-]+)+#', $test, $matches);

Может кто-нибудь объяснить мне, почему это не работает ..? Я не вижу, какое «правило» я не уважаю здесь ..

2

Решение

Первый + после ) (([-;\w\ \.\/\'\d\(\)\&]+)+) вызывает катастрофическую проблему с возвратом (увидеть подробнее об этом здесь) как это случай (a+)+ тип шаблона, который не является конечным подшаблоном. Удаление этого + уже решает проблему.

Последний подшаблон имеет ту же проблему, но не вызывает проблем из-за внутренней оптимизации PCRE.

Кроме того, я думаю, что вам не нужно никаких регулярных выражений здесь, используйте explode а также strip_tags:

$test =  '<a id="test">One &amp; -Two&nbsp;-&nbsp;Three</a>';
$res = explode("&nbsp;-&nbsp;", strip_tags($test));
echo $res[0]. "\n" . $res[1];

Увидеть PHP демо

1

Другие решения

Других решений пока нет …