2010-12-03 3 views
2

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

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

Например:

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

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

Полученный массив должен быть [жакет, Джек, Джексонвилл]

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

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

print $matches[1]; 

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

+1

показать существующий код :-) – Erik 2010-12-03 03:41:11

+0

Особенно регулярное выражение, которое вы пытались использовать! – GWW 2010-12-03 03:43:12

ответ

4

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

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

See it

1

Вы должны read the manual несколько сотен раз, и в конце концов придет к вам.

В противном случае, что вы пытаетесь захватить можно выразить как «найти„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]); 
  • Примечание: по «букве» Я имею в виду любое «слово символ.» Официально это включает числа и другие «текстовые символы». В зависимости от конкретных обстоятельств, один может предпочесть \ ш (слово символа) или \ Ь (границу слова.)

Вы можете включать в себя дополнительные символы, с помощью character class.Например, для того, чтобы соответствовать любое слово символа, а также одинарные кавычки, вы можете использовать [\w'] и ваше регулярное выражение становится:

$q = "/(?<!\\w)(jac[\\w']*)/i"; 

В качестве альтернативы, вы можете добавить дополнительный 's к существующей модели, так что вы захватить " JAC»с последующим любым количеством символов слова, возможно, с последующим«'s»

$q = "/(?<!\\w)(jac\\w*(?:'s)?)/i"; 

Здесь ?: в скобках означает, что вы на самом деле не нужно, чтобы захватить их содержание (потому что они уже внутри пара круглых скобок, это необязательно), а ? после В скобках указано, что совпадение является необязательным.