我在PHP中有一个文本存储在变量$ row中。我想找到一组单词的位置,这很容易。什么不是那么容易让我的代码认识到它找到的单词正是我正在寻找的单词或更大单词的一部分。有办法吗?
我想获得的例子
CODE:
$row= "some ugly text of some kind i'd like to find in someway"
$token= "some";
$pos= -1;
$counter= substr_count($row, $token);
for ($h=0; $h<$counter; $h++) {
$pos= strpos($row, $token, $pos+1);
echo $pos.' ';
}
输出:
我获得了什么:
0 17 47
我想获得什么
0 17
任何提示?
答案 0 :(得分:3)
将preg_match_all()
与字边界(\b
)一起使用:
$search = preg_quote($token, '/');
preg_match_all("/\b$search\b/", $row, $m, PREG_OFFSET_CAPTURE);
这里,preg_quote()
语句用于正确转义用户输入,以便在我们的正则表达式中使用它。有些字符在正则表达式语言中具有特殊含义 - 如果没有适当的转义,这些字符将失去其特殊含义&#34;并且你的正则表达式可能无法按预期工作。
在preg_match_all()
声明中,我们提供以下正则表达式:
/\b$search\b/
<强>解释强>
/
- 开始分隔符\b
- 字边界。在大多数正则表达式方言中,单词边界是单词字符(\w
)和非单词字符(\W
)之间的位置。 $search
- 转义搜索字词\b
- 字边界/
- 结束分隔符用简单的英语表示:找到给定单词some
的所有出现次数。
请注意,我们也在这里使用PREG_OFFSET_CAPTURE
标志。如果传递此标志,则对于每个发生的匹配,还将返回附加字符串偏移量。有关详细信息,请参阅the documentation。
要获得所需的结果,您只需循环遍历$m
数组并提取偏移量:
$result = implode(' ', array_map(function($arr) {
return $arr[1];
}, $m[0]));
echo $result;
<强>输出:强>
0 18
答案 1 :(得分:2)
您正在寻找的是Regex与单词边界模式的组合以及返回偏移量的标志(PREG_OFFSET_CAPTURE
)。
PREG_OFFSET_CAPTURE
如果传递此标志,则对于每个匹配的附件 字符串偏移也将被返回。请注意,这会改变 匹配值到一个数组中,其中每个元素都是一个数组 由偏移量为0的匹配字符串及其字符串偏移量组成 到第1个偏差的主题。
$row= "some ugly text of some kind i'd like to find in someway";
$pattern= "/\bsome\b/i";
preg_match_all($pattern, $row, $matches, PREG_OFFSET_CAPTURE);
我们得到这样的东西:
Array
(
[0] => Array
(
[0] => Array
(
[0] => some
[1] => 0
)
[1] => Array
(
[0] => some
[1] => 18
)
)
)
然后循环完成匹配并提取在大海捞针中找到针的偏移量。
// store the positions of the match
$offsets = array();
foreach($matches[0] as $match) {
$offsets[] = $match[1];
}
// display the offsets
echo implode(' ', $offsets);
答案 2 :(得分:-1)
使用preg_match()
:
if(preg_match("/some/", $row))
// [..]
第一个参数是正则表达式,它几乎可以匹配任何你想要匹配的东西。但是,有dire warnings使用它来匹配像HTML这样的东西。