2016-10-21 3 views
2

вот строка: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); 

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

+0

Вы пытаетесь получить значение из элемента HTML, используя регулярное выражение, если это так, пожалуйста, используйте dom или simple html dom – Kumar

+0

помните, что '([-; \ w \ \. \/\ '\ d \ (\) \ &] +) +' инициирует катастрофическое обратное отслеживание, если совпадение не выполнено –

+0

У вас также есть * * lots ** ненужных обратных косых черт, что делает вещь очень трудной для чтения ... –

ответ

1

Первый + после ) (([-;\w\ \.\/\'\d\(\)\&]+)+) causes the catastrophic backtracking issue (см more on this here), как это случай (a+)+ типа рисунка, который не является концовка подшаблон. Удаление этого + уже solves the issue.

Последний подшаблон имеет ту же проблему, но не вызывает проблем из-за внутренних оптимизаций 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 demo

+1

вы правы для '+' после ')'. Спасибо – hacko