编写一个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."