【问题标题】:PHP - preg_match whole word from associative array, working with stristr but not preg_matchPHP - preg_match 关联数组中的整个单词,使用 stristr 但不是 preg_match
【发布时间】:2023-03-24 04:58:02
【问题描述】:

我正在循环一个关联数组,并尝试将针数组中的整个单词匹配到 haystack 数组中。以下代码完美运行,但返回太多结果,因为它匹配任何出现的字符串:

$result = array();
$name1 = array();
$name2 = array();
foreach($object->organizations as $o) {
    foreach($objectCrunch as $o2) {
        $name1 = $o->name;
        $name2 = $o2->name;

        if(stristr($name2, $name1)) {
            $result[] = $o2->permalink;
        }
    }
}

当我尝试以下代码时:

$result = array();
$name1 = array();
$name2 = array();
foreach($object->organizations as $o) {
    foreach($objectCrunch as $o2) {
        $name1 = $o->name;
        $name2 = $o2->name;

        $pattern = "'/\b" . $name2 . "\b/i'";

        if(preg_match($pattern, $name1)) {
            $result[] = $o2->permalink;
        }
    }
}

我得到一个空数组。任何让最后一段代码工作的帮助都会很棒。

谢谢, 格雷格

【问题讨论】:

  • 尝试用$pattern = "'/\b" . preg_quote( $name2) . "\b/i'";替换$pattern = "'/\b" . $name2 . "\b/i'";
  • 服务器错误...我认为 $pattern 字符串不是问题所在。我认为问题是我的正则表达式是否正确。
  • 您的$pattern 字符串正在形成一个正则表达式,因此两者是一回事。

标签: php regex arrays foreach preg-match


【解决方案1】:

你在这里使用了两对delimiters

$pattern = "'/\b" . $name2 . "\b/i'";
            ||      
            1|
             2

使用/'
我想说单引号是多余的,是仓促复制粘贴的结果。

另外,preg_quote 用于内容/单词,如果它可能包含其中任何一个。


正如 Elias 指出的那样;下一个陷阱可能是尝试使用长内容变量作为搜索参数。如果您没有给变量提供无意义的枚举名称,这将是一个明显的错误。

其中只有一个可能是实际的单词或名称。另一个应该叫内容什么的:

    $word = $o->name;
    $textcontent = $o2->name;

以后使用这些。
同时,也相应地修复对象属性命名。

【讨论】:

  • preg_quote 如果$name2 包含我们不希望被评估的任何特殊正则表达式字符(例如句点、星号或加号),也将是必需的。
  • 很好,但问题不是比这个更根本吗?即:干草堆->针与模式->字符串
  • 这就是我的意思,OP 使用来自stristr 调用的干草堆作为模式,以匹配 $name1 变量
【解决方案2】:

真的很简单。感谢 php 中的一些怪癖,stristr 语法如下:

stristr($haystack,$needle);

preg_match 的第一个参数就像一根针。示例:

$name1 = 'name of chief object';
$name2 = 'I am a child of name of chief object';
stristr($name2,$name1);//looks for 'name of chief object' in $name2

preg_match('/\b'.$name2.'\b/i',$name1);//does the exact oposite

【讨论】:

  • 是的,你是对的。 $name2 确实是大海捞针,因此它不能作为 preg_match 的搜索参数(在任何正则表达式变体中)。 -- 所以,如果有的话,这是一个关于如何不给无表情的变量名的教训。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多