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