2010-12-03 115 views
2

我试图从各种字符串中提取匹配特定模式的单词。从字符串获取单词 - PHP

字符串的长度和内容各不相同。

例如:

我想提取与江淮汽车开始从以下字符串的所有文字和填充完整单词的数组:

  • 我昨天买了一件夹克。
  • 杰克回家了。
  • 我想去杰克逊维尔。

结果数组应该是[外套,杰克,杰克逊]

我一直在尝试使用的preg_match(),但由于某种原因,它不会工作。有什么建议么???

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

print $matches[1]; 

这将返回空值: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]); 
  • 注:由“信”我的意思是任何“单词字符”。它正式包含数字和其他“单词字符”。根据确切的情况,一个可能更喜欢\ W(字字符)或\ B(字边界)

您可以通过使用一个character class包括额外的字符。例如,为了匹配任何单词字符以及单引号,您可以使用[\w']和你的正则表达式变成:

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

或者,你可以添加一个可选's到您现有的模式,让你捕捉“江淮”后跟任意数量的单词字符随后任选地“的”

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

这里,括号内的?:意味着你实际上并不需要捕捉的内容(因为他们已经内一对括号,这是没有必要的),并在?之后括号表示匹配是可选的。