2012-06-07 2 views
1

я бы знать, как соответствовать все теги меньше "<?" и "?>" Например:PHP: выражение регулярное, под «<?" and "?>», как оно работает?

"<?root?><abcd>" 

Я подумал:

preg_match_all(/[^(<\?)(\?>)]+/, $str, $match); 

но rsult является ["root", "abcd"] вместо я пустошь хотел быть настолько ["<abcd>"]

Спасибо!

+0

Вы знаете, что такое класс символов в регулярном выражении? – hakre

ответ

3
<(?!\?).+?(?<!\?)> 

Это должно сделать трюк.

Объяснение:

< -- A < 
(?! -- Not followed by: (See link 1 - Positive and Negative Lookahead) 
    \? -- A ? 
) 
.+? -- As few characters as necessary (See link 2 - Laziness Instead of Greediness) 
(?<! -- Not preceded by: (See link 1 - Positive and Negative Lookbehind) 
    \? -- A ? 
) 
> -- A > 
  1. Lookaround
  2. Repetition

IIRC, вы могли бы сделать это:

preg_match_all('/<(?!\?).+?(?<!\?)>/', $str, $match); 

Однако it isn't a good idea to parse HTML with a regex.

+0

Что делать? (?! \?) "И". +? " имею в виду? Спасибо u. – Donovant

+1

См. Обновленный ответ. –

2

Я уверен, надеюсь, что это не HTML, но это будет соответствовать скобка окружал слова без вопросительных знаков между ними:

/<\w+>/ 

Если кроме \w символов допускается внутри, но нет знаков вопроса:

/<[^>?]+>/ 

Если вопросительные знаки разрешены внутри, но отбрасываются только при смежно с угловыми скобками:

/<[^?].*?[^?]>/ 

Однако вышеупомянутое будет иметь побочный эффект, который не будет согласован с <b> из-за ограничения минимальной длины.

0

Это тривиально, но вы приближаетесь к нему неправильно. Вы должны соответствовать тому, что хотите, а не соответствовать тому, чего вы не хотите. Чтобы соответствовать тегу, воспользуйтесь изменением:

<\w+[^>\?]*> 

Приготовление этого как можно более конкретного. Пока \? не входит в набор допустимых символов в теге, это должно быть хорошо. Также обратите внимание, что это будет соответствовать тегам с атрибутами.

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