Получить слово из строки — PHP

Я пытаюсь извлечь слово, соответствующее определенному шаблону, из разных строк.

Строки различаются по длине и содержанию.

Например:

Я хочу извлечь любое слово, начинающееся с jac, из следующих строк и заполнить массив полными словами:

  • Купил куртку вчера.
  • Джек собирается домой.
  • Я хочу поехать в Джексонвилл.

Результирующий массив должен быть [пиджак,Джек,Джексонвилл]

Я пытался использовать preg_match(), но по какой-то причине это не сработает. Какие-либо предложения???

$q = "jac";
$str = "jacket";
preg_match($q,$str,$matches);

print $matches[1];

Это возвращает ноль: S. Я не знаю, в чем проблема.


person AlexBrand    schedule 03.12.2010    source источник
comment
Особенно регулярное выражение, которое вы пытались использовать!   -  person GWW    schedule 03.12.2010


Ответы (2)


Вы можете использовать preg_match как:

preg_match("/\b(jac.+?)\b/i", $string, $matches);

Посмотреть

person codaddict    schedule 03.12.2010

Вам нужно прочитать руководство несколько сотен раз. раз, и это в конечном итоге придет к вам.

В противном случае то, что вы пытаетесь зафиксировать, может быть выражено как «ищите '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
comment
Эй, спасибо за это! Я очень ценю это. Я тестировал код и понял, что хотел бы включить кавычки, например: имя Джека будет соответствовать брату Джека по имени Гэри. - person AlexBrand; 03.12.2010
comment
Буду ли я использовать что-то вроде этого: /(?‹!\\w)(jac\\w*'\w)/i ? Спасибо! - person AlexBrand; 03.12.2010