【问题标题】:PHP- Regex to match words with more than two lettersPHP-正则表达式匹配两个以上字母的单词
【发布时间】:2020-10-08 01:30:06
【问题描述】:

我正在尝试将一个字符串分解为一个单词数组,条件是一个单词只有当它有两个或多个字母时才被认为是这样的,我所拥有的是以下,但只有一个字母的单词仍然是被视为匹配:

$input_string = "I have a cake inside my fridge";

$string_array = preg_split("/[^\w{2,}]*([\s]+([^\w{2,}])*|$)/", $input_string, -1, PREG_SPLIT_NO_EMPTY);

但我仍然收到“I”和“a”这两个词,为什么它不起作用?

【问题讨论】:

  • Alt 没有正则表达式.. 即不那么混乱,用 array_filter 爆炸:3v4l.org/kdPgh
  • @LawrenceCherone 是的,谢谢,但必须使用正则表达式模式:/
  • 您期望的确切输出是什么?

标签: php regex


【解决方案1】:

它不工作的原因是因为模式[^\w{2,}]*([\s]+([^\w{2,}])*|$)matches only spaces,然后你在这些空格上拆分,导致一个包含所有单词的数组。这是因为 \s 匹配空白字符,并且使用了否定字符类 [^\w{2,}] 也匹配空白字符。

如果要使用拆分,还必须匹配单个单词字符,使它们不属于结果的一部分。


如果您必须使用拆分,您可以匹配由可选水平空白字符包围的单个单词字符以将其删除,或者匹配 1+ 个水平空白字符。

\h*\b\w\b\h*|\h+

Regex demo

例如

$input_string = "I have a cake inside my fridge";
$string_array = preg_split("/\h*\b\w\b\h*|\h+/", $input_string, -1, PREG_SPLIT_NO_EMPTY);
print_r($string_array);

输出

Array
(
    [0] => have
    [1] => cake
    [2] => inside
    [3] => my
    [4] => fridge
)

如果要匹配至少包含 2 个字符的所有字符串,还可以使用 \S{2,}preg_match_all

【讨论】:

    【解决方案2】:

    如果您只想捕获所有包含 2 个或更多字母的“单词”,则只需在此处使用 preg_match_all

    $input_string = "I have a cake inside my fridge";
    preg_match_all("/\b\w{2,}\b/", $input_string, $matches);
    print_r($matches[0]);
    

    打印出来:

    Array
    (
        [0] => have
        [1] => cake
        [2] => inside
        [3] => my
        [4] => fridge
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2016-12-03
      • 2018-10-26
      相关资源
      最近更新 更多