2011-01-13 3 views
1

Я изучаю о регулярных выражениях, я понял, некоторые по поводу соответствия одного или более символов, но у меня есть дело, но не знаю, как решить эту проблему ..Нужна помощь в PHP Regex

Например у меня есть :

$data = "bla bla -start- blu blu blu -end- bla bla"; 
$pattern = "/\-start\-[\w]\-end\- /"; 
preg_match($pattern, $data, $matches); 
print_r($matches); 

я намерен взять что-нибудь между '-start-' и 'КОНЕЦ', поэтому я ожидаю получить
'СИН СИН BLU'.
любое предложение?

ответ

4

\w представляет собой только символы слова, и вам также необходимо использовать пробелы. Предполагая, что вы действительно хотите разрешить что-либо между -start- и -end-, вы можете использовать ., который соответствует любому символу.

переносов не должны быть экранированы, если не заключен в последовательности символов (в квадратных скобках [ и ]), так что вы можете заменить \- только с -.

Так же, как с помощью одного \w представляет соответствующий любой одного слова символа, . представляет собой соответствие любого единого характера, поэтому вам нужно добавить больше информации. После любой из них с + будет означать соответствие по крайней мере, один символ, или с * будет указывать ноль или более символов. Предполагая, что вы хотите, по крайней мере один символ, ваше выражение должно быть в порядке, как это:

$pattern = "/-start-(.+)-end- /"; 

Предположив вы можете столкнуться выражение типа: -start- foo -end- -end- и вы хотите завершить на первом -end- (содержание в экстракте foo), то вам нужно действовать не жадным способом. регулярное выражение в PHP жаден по умолчанию, чтобы отключить это, вы будете следовать + (или *) с ?, как это:

$pattern = "/-start-(.+?)-end- /"; 
+0

переносов не нужно экранировать, за исключением символьных классов. В противном случае ваш ответ будет споткнуться. – coreyward

+0

@coreyward: Я так не думал и проверял - прошел быстрый тест, и, в частности, побег ничего не сломал. В любом случае, обновляется соответствующим образом. –

+0

Хотя его вопрос не упоминает об этом, если между '-start-' и '-end-' существуют символы новой строки, вы должны установить модификатор 's-to-all '' s'. Поэтому '$ pattern ="% -start- (. +?) -end-% six ";' Я также использую модификатор 'x' для сохранения читаемости со сложными шаблонами, поскольку он заставляет движок игнорировать пробелы (помните вам необходимо добавить пробел к шаблону, если вы хотите включить его через '\ s'), а также модификатор' i' для нечувствительности к регистру. – Dan

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