使用 strpos 在 php 字符串中搜索标签

search tags in a php string with strpos

这是一个 UTF-8 字符串

$string = '<h2> a none english char - utf-8 string </h2>';

我想检查 <h2> 标签是否存在于 $string 中

我试试:

if(strpos($string , '<h2>'))
or
if(strpos($string , '<h2>') == true )
or
if(strpos($string , '<h2>') === true)
or
if(mb_strpos($string , '<h2>' ))

但所有这些条件都返回错误。怎么了?

您的测试失败,因为您的 "needle" 字符串恰好出现在您的大海捞针的开头,因此 strpos() 将 return 0 指示字符串开头。

if (0)          -> false
if (0 == true)  -> false
if (0 === true) -> false

在这种情况下不能使用相等,必须使用不等:

if (strpos(...) !== FALSE)

评论跟进:

我没看出来怎么可能"no effect at all":

php > $string = '<h2> a none english char - utf-8 string </h2>';
php > var_dump(strpos($string, '<h2>'));
int(0)
php > var_dump(strpos($string, '<h2>') == true);
bool(false)
php > var_dump(strpos($string, '<h2>') === true);
bool(false)
php > var_dump(mb_strpos($string, '<h2>'));
int(0)
php > var_dump(mb_strpos($string, '<h2>') !== false);
bool(true)

你的最后一个应该可以工作(使用 mb_strpos)。 但是在你的字符串中,"" 是字符串的开头,因此位于位置 0。 mb_strpos 或 strpos returns 子字符串的位置(如果找到),如果未找到,则返回布尔值 false。 因为你正在检查这样的条件:

if (mb_strpos($string, '<h2>'))

您实际检查的是:

if (0)

这就是为什么你认为它是错误的。 使用:

if (mb_strpos($string , '<h2>') !== false)