从字符串中获取单词 - PHP

时间:2010-12-03 03:38:55

标签: php arrays string preg-match

我正在尝试从各种字符串中提取与特定模式匹配的单词。

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

例如:

我想从以下字符串中提取以jac开头的任何单词,并使用完整的单词填充数组:

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

结果阵列应该是[夹克,杰克,杰克逊维尔]

我一直在尝试使用preg_match()但由于某种原因它无法正常工作。任何建议???

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

print $matches[1];

返回null:S。我不知道问题是什么。

2 个答案:

答案 0 :(得分:4)

您可以将preg_match用作:

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

See it

答案 1 :(得分: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,以便捕获“jac”,后跟任意数量的单词字符,后跟“s”

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

这里,括号内的?:表示您实际上并不需要捕获它们的内容(因为它们已经在一对括号内,这是不必要的),而?之后括号表示匹配是可选的。