2015-09-28 6 views
0

У меня есть шаблон регулярного выражения, который пытается сопоставить строку, но он делает это неправильно, поэтому я собираюсь указать части шаблона регулярного выражения и что он делает в надежде получить это право на этот раз :Соответствие шаблону регулярного выражения

~ : the start of the regex pattern 
, : trying to match the , at the start of the string 
.* : 0 or more of any characters in between 
=? : stop at the first match of the rest of the pattern 
\. : a period 
\" : a quote 
/: a slash 
> : arrow right 
< : arrow left 
~ : end of pattern 

Код:

$content = ", not good in any manner or degree. See more.\"/><" 

$regex = "~,.*=?\.\"/><~"; 
preg_match_all("/$regex/siU", $content, $matches); 

echo "<pre>"; 
print_r($matches); 
echo "</pre>"; 

Ошибка:

Unknown modifier '/' 
Unknown modifier '>' 
Unknown modifier '<' 

Но, насколько мне известно, эти [\^$. |? * +() {} Являются метасимволами регулярных выражений, которые необходимо экранировать. Во всяком случае, я избежал/и <, и ошибка исчезла, но на этот раз я получил пустой массив.

$regex = "~,.*=?\.\"\/\>\<~"; 
preg_match_all("/$regex/siU", $content, $matches); 

echo "<pre>"; 
print_r($matches); 
echo "</pre>"; 

Результаты:

Array 
(
    [0] => Array 
     (
     ) 
) 

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

+2

«** Соответствие шаблону регулярного выражения **« Регулярно правильно, что вы ошибаетесь. –

+0

Вы должны использовать регулярное выражение для анализа HTML, правильно? Если да, это преступник. –

+0

@PedroLobito Что ты говоришь? Я получаю пустой массив. Как это правильно? – frosty

ответ

2

Вы должны бежать все обратные косые черты, а также вы используете два разделители ~ и /, вы можете использовать код ниже:

$regex = "~,.*=?\\.\"/><~siU"; 
preg_match_all("$regex", $content, $matches); 

Вы можете быстро увидеть это с помощью какого-либо регулярных выражений онлайна инструмента, как regex101

https://regex101.com/r/dT1pQ7/1

Btw, не уверен, что если вы хотите, чтобы ваш = необязательными или нет, но =? делает = быть оп онные.

Обновления: после прочтения вашего комментария к «остановить» в первом матче вы должны использовать не жадный оператор путем добавления ? после квантора как Chris сказал делает трюк, так .+? или .*? ленивые или nongreedy кванторов решений: остановка при первом вхождении

+0

Побег всех обратных косых черт, кроме одного с цитатой? – frosty

+0

Кроме того, я думал =? означает остановку при первом \\. \ "/><. – frosty

+0

'. *? 'означает остановку при первом.' =? 'означает, что' = 'является необязательным. – chris85

Смежные вопросы