Вы должны прочитать руководство несколько сотен раз, и оно в конечном итоге придет к вам.
В противном случае то, что вы пытаетесь захватить, может быть выражено как "взгляддля 'jac', за которым следуют 0 или более букв * и убедитесь, что ему не предшествует буква ", которая дает вам: /(?<!\\w)(jac\\w*)/i
Вот пример с preg_match_all()
, так что вы можете захватить все вхождения шаблона, а не только первый:
$q = "/(?<!\\w)(jac\\w*)/i";
$str = "I bought a jacket yesterday.
Jack is going home.
I want to go to Jacksonville.";
preg_match_all($q,$str,$matches);
print_r($matches[1]);
- Примечание: под «буквой» я подразумеваю любой «символ слова».Официально в него входят цифры и другие «буквенные знаки».В зависимости от конкретных обстоятельств, можно выбрать \ w (символ слова) или \ b (граница слова).
Вы можете включить дополнительные символы, используя класс символов * 1020.*.Например, чтобы сопоставить любой символ слова, а также одинарные кавычки, вы можете использовать [\w']
, и ваше регулярное выражение становится:
$q = "/(?<!\\w)(jac[\\w']*)/i";
В качестве альтернативы, вы можете добавить необязательный 's
в существующий шаблон, так что вы записываете «jac», за которым следует любое количество символов слова, за которыми следуют «s»
$q = "/(?<!\\w)(jac\\w*(?:'s)?)/i";
Здесь ?:
в скобках означает, что вам на самом деле не нужно захватыватьих содержание (поскольку они уже заключены в пару круглых скобок, это не нужно), а ?
после скобок означает, что сопоставление является необязательным.