PHP str替换数组

时间:2016-09-22 09:37:09

标签: php arrays replace str-replace

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

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

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

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

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

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

之后我用str_replace检查以替换文本内部的所有主题标签。它必须是str_replace才能具有敏感性。

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

文本的输出是

tag ! Lorem Ipsum dolor sit ament.

因为" Hashtag"的哈希被" hash"取代主题标签

我找到了这个解决方案:PHP string replace match whole word这对我有用。但我有一个完整的数组来检查(动态)不仅一个单词。

现在的问题是: 我怎样才能检查整个单词不仅是单词的一部分,所以" hash"不会影响"#标签"?

修改 我想展示" Hashtag! Lorem Ipsum ...."不仅仅是#34;! Lorem Ipsum ......"。这就是为什么我选择密钥敏感 - 链接主题标签都是小写(哈希),句子中使用的标签是小写(Hashtag)。所以我可以删除那些我不需要建立正确句子的内容。 例如它也可能是#34;我们#Want you" - 所以传递的主题标签将是"想要"。如果我更换所有输出将是"我们你"。如果我用keysensitive替换整个单词,那将是"我们#Want you"。希望你明白我想做什么。

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试使用RegEx去除主题标签。您可以使用 preg_replace 功能,例如

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

实际上它会是:

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

这样它就会删除#char开头的所有单词(带 \ b 字边界元字符)。

希望它有所帮助。

修改

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

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

您只需要实现 is_first_uppercase 功能,例如like this

使用:

"Hashtag ! Lorem Ipsum Dolor sit ament."

它应该产生:

figure