В вашем случае лучше использовать preg_match с дополнительным параметром и круглыми скобками:
preg_match("#((?:<|<)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|>))#i",$markup, $out);
print_r($out);
Array
(
[0] => <% your stuff %>
[1] => <%
[2] => your stuff
[3] => %>
)
Кстати, проверьте этот онлайн-инструмент для отладки регулярных выражений PHP, это так полезно!
http://regex.larsolavtorvik.com/
РЕДАКТИРОВАТЬ: Я немного взломал регулярное выражение, так что это быстрее. Протестировал, все работает: -)
Теперь давайте объясним все это:
- preg_match будет хранить все, что он захватывает, в переменной, переданной как третий параметр (здесь $ out)
- если preg_match совпадает с чем-либо, оно будет сохранено в $ out [0]
- все, что внутри (), но не (? :) в шаблоне, будет сохранено в $ out
Паттен в деталях:
#((?:<|<)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|>))#i can be viewed as ((?:<|<)%) + ([\s]*(?:[^ø]*)[\s]*?) + (%(?:>|>)).
((?:<|<)%) is capturing < or < then %
(%(?:>|>)) is capturing % then < or >
([\s]*(?:[^ø]*)[\s]*?) means 0 or more spaces, then 0 or more times anything that is not the ø symbol, the 0 or more spaces.
Почему мы используем [^ ø] вместо. ? Это потому что . очень много времени, механизм регулярных выражений будет проверять все существующие символы. [^ ø] просто проверьте, не является ли символ ø. Никто не использует ø, это международный денежный символ, но если вам интересно, вы можете заменить его на chr (7), который является символом колокольчика, который, очевидно, никогда не будет напечатан на веб-странице.
РЕДАКТИРОВАТЬ2: Я только что прочитал вашу редакцию о захвате всех матчей. В этом случае вы будете использовать preg_match_all таким же образом.