PHP str-替换数组中的整个单词


PHP str-replace whole word from array

编写一个instagram小部件给我留下了一个我自己无法解决的问题。我收到一个数组文本,其中包含图像描述和标签,如:

"text": "#Hashtag ! Lorem Ipsum dolor sit ament. #hash #myword #another #hashing",

和另一个包含所有标签的数组,如:

 "tags": [
        "hashtag",
        "hash",
        "myword",
        "another",
        "hashing",
      ],

我的插件提供了一个选项来选择显示描述,标签或描述和标签。

因此,我必须从标签中删除标签。到目前为止很容易。首先,我将所有标签扩展为以"#"开头,这样"hashtag"就变成了"#hashtag",并将它们保存到一个新数组(alltags)。

之后,我正在检查str_replace以替换所有也在文本内的标签。它需要str_replace是键敏感的。

$noTags = str_replace($alltags, "", $instagramText);

文本的输出是

tag ! Lorem Ipsum dolor sit ament.

因为"Hashtag"的哈希值被"hash"的哈希值所取代。

我找到了这个解决方案:PHP字符串替换匹配整个单词应该为我工作。但是我要动态地检查整个数组,而不仅仅是一个单词。

现在的问题是:我如何检查整个单词而不是部分单词,这样"hash"不会影响"hashtag"?

编辑我想展示"Hashtag!"Lorem Ipsum...."不只"!Lorem Ipsum……"。这就是为什么我选择了键敏感-链接标签都是小写的(哈希),句子中使用的标签是而不是小写(Hashtag)。所以我可以删掉那些我不需要的句子。例如,它也可以是"我们#想要你"——所以传递的标签将是"想要"。如果我替换掉所有的输出,就会变成"我们你"。如果我把整个单词替换为键敏感,它将是"We #Want you"。希望你能理解我在努力做什么。

谢谢!

尝试使用RegEx剥离标签。您可以使用preg_replace函数,例如

$tags = implode('|', $tagsArray);
$noTags = preg_replace('/'#(' . $tags . ')'b/i', '', $instagramText);

所以实际上应该是:

$noTags = preg_replace('/'#(hashtag|hash|myword|another|hashing)'b/i', '', $instagramText)
// result:
" ! Lorem Ipsum dolor sit ament.    "

这样它会去掉所有以# char开头的单词(带有'b字边界元字符)。

希望有帮助。

编辑

使用preg_replace_callback检查匹配的标签是否以大写字母开头,如:

preg_replace_callback(
    '/' ?#(' . $tags . ')'b ?/i',
    function($matches) {
        return is_first_uppercase($matches[1]) ? str_ireplace('#' . $matches[1], $matches[1], $matches[0]) : '';
    },
    $instagramText
);

你只需要实现is_first_uppercase函数,例如如下

:

"#Hashtag ! Lorem Ipsum #Dolor sit ament. #hash #myword #another #hashing"

它应该产生:

"Hashtag ! Lorem Ipsum Dolor sit ament."