2008-11-13 3 views
4

Как я могу сопоставить (PCRE) все между двумя тегами?Сопоставьте все между двумя тегами с регулярными выражениями?

Я пытался что-то вроде этого: (. *)!

< - - \ S * LoginStart \ s * > < - \ S * LoginEnd \ s * - >

Но это не сработало очень хорошо для меня ..

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

Thanks

ответ

12
$string = '<!-- LoginStart --><div id="stuff">text</div><!-- LoginEnds -->'; 
$regex = '#<!--\s*LoginStart\s*-->(.*?)<!--\s*LoginEnds\s*-->#s'; 

preg_match($regex, $string, $matches); 

print_r($matches); // $matches[1] = <div id="stuff">text</div> 

объяснение:

(.*?) = non greedy match (match the first <!-- LoginEnds --> it finds 
    s = modifier in $regex (end of the variable) allows multiline matches 
     such as '<!-- LoginStart -->stuff 
       more stuff 
       <!-- LoginEnds -->' 
1

PHP и регулярное выражение? Вот некоторые предложения:

'/<!--\s*LoginStart\s*-->(.*)<!--\s*LoginEnd\s*-->/Us' 

Может быть лучше - U капитализируются делает регулярное выражение не жадный, что означает, что он будет останавливаться на первом <!--, которые могут работать. Но важным является s, в котором регулярное выражение соответствует символу новой строки с символом ..

В зависимости от того, насколько вы уверены в капитализации, добавление i в конец сделает поиск в регистре нечувствительным к регистру.

+0

Может ли уценка быть более раздражающим? – 2008-11-13 19:51:39

0

я попробовал ответ Оуэна, но его не удается в условиях, как

<!-- LoginStart --><div id="stuff">text</div><!-- LoginEnds -->"DONT MIND THIS"<!-- LoginStart --><div id="stuff">text</div><!-- LoginEnds -->

Это включает в себя линию "не возражает ЭТОТ" также, что он охватывает все содержимое в течение первых <! - LoginStart - > и последние <! - LoginEnds - > tag