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",
],
我的插件提供了一个选项 select 来显示描述、标签或描述和标签。
因此我必须从标签中删除标签。到目前为止很容易。
首先,我获取所有标签并将它们扩展为以“#”开头,因此 "hashtag" 变为“#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"?
编辑
我不仅要显示 "Hashtag! Lorem Ipsum...." “!Lorem Ipsum...”。这就是为什么我选择关键敏感 - 链接主题标签都是小写(哈希),句子中使用的标签是 而不是 小写(哈希标签)。所以我可以删除那些我不需要构建正确句子的那些。
例如,它也可以是 "We #Want you" - 因此传递的主题标签将是 "want"。如果我替换所有输出将是 "We you"。如果我用 keysensitive 替换整个单词,它将是 "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函数,例如like this
有:
"#Hashtag ! Lorem Ipsum #Dolor sit ament. #hash #myword #another #hashing"
它应该产生:
"Hashtag ! Lorem Ipsum Dolor sit ament."
编写 Instagram 小部件给我留下了一个我无法自己解决的问题。我收到一个包含图像描述和标签的数组文本,例如:
"text": "#Hashtag ! Lorem Ipsum dolor sit ament. #hash #myword #another #hashing",
和另一个包含所有标签的数组,如:
"tags": [
"hashtag",
"hash",
"myword",
"another",
"hashing",
],
我的插件提供了一个选项 select 来显示描述、标签或描述和标签。
因此我必须从标签中删除标签。到目前为止很容易。 首先,我获取所有标签并将它们扩展为以“#”开头,因此 "hashtag" 变为“#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"?
编辑 我不仅要显示 "Hashtag! Lorem Ipsum...." “!Lorem Ipsum...”。这就是为什么我选择关键敏感 - 链接主题标签都是小写(哈希),句子中使用的标签是 而不是 小写(哈希标签)。所以我可以删除那些我不需要构建正确句子的那些。 例如,它也可以是 "We #Want you" - 因此传递的主题标签将是 "want"。如果我替换所有输出将是 "We you"。如果我用 keysensitive 替换整个单词,它将是 "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函数,例如like this
有:
"#Hashtag ! Lorem Ipsum #Dolor sit ament. #hash #myword #another #hashing"
它应该产生:
"Hashtag ! Lorem Ipsum Dolor sit ament."