【问题标题】:Get word from string - PHP从字符串中获取单词 - PHP
【发布时间】:2010-12-03 03:38:54
【问题描述】:

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

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

例如:

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

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

结果数组应该是 [jacket,Jack,Jacksonville]

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

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

print $matches[1];

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

【问题讨论】:

  • 尤其是你尝试使用的正则表达式!

标签: php arrays string preg-match


【解决方案1】:

您可以将preg_match 用作:

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

See it

【讨论】:

    【解决方案2】:

    你必须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";
    

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

    【讨论】:

    • 嘿,谢谢!对此,我真的非常感激。我正在测试代码并意识到我想包含引号,例如:“Jack's”将与“Jack's Brother is named Gary”匹配。
    • 我会使用这样的东西: /(?\w)/i 吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多