Вам нужно прочитать руководство несколько сотен раз. раз, и это в конечном итоге придет к вам.
В противном случае то, что вы пытаетесь зафиксировать, может быть выражено как «ищите '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 (граница слова).
Вы можете включить дополнительные символы, используя класс символов. Например, чтобы сопоставить любой символ слова, а также одинарные кавычки, вы можете использовать [\w']
, и ваше регулярное выражение станет таким:
$q = "/(?<!\\w)(jac[\\w']*)/i";
В качестве альтернативы вы можете добавить необязательный 's
к существующему шаблону, чтобы захватить «jac», за которым следует любое количество словесных символов, за которыми может следовать «s».
$q = "/(?<!\\w)(jac\\w*(?:'s)?)/i";
Здесь ?:
внутри круглых скобок означает, что вам на самом деле не нужно захватывать их содержимое (поскольку они уже находятся внутри пары круглых скобок, в этом нет необходимости), а ?
после круглых скобок означает, что совпадение необязательно.
person
Josh Davis
schedule
03.12.2010