我使用了preg_match_all的PREG_PATTERN_ORDER
来返回字符串中找到的值的位置。然后在尝试substr
时,引用它们,它们不会排成一行。我预计会有一个偏移量,但每个案例似乎有一个未确定的错位。
这是因为preg_match_all是返回字节而不是字符?如果是这样,有没有办法将字节转换为字符?如果我完全不合适,我可以发布一些代码......
好的,这是适用的代码:
// RETURN POSITION OF START AND END TAGS TO ARRAY
function getTagPositions($strBody, $start, $end)
{
preg_match_all('/' . preg_quote($start, '/') . '([\w\s.]*?)'. preg_quote($end, '/').'/im', $strBody, $strTag, PREG_PATTERN_ORDER);
$intOffset = 0;
$intIndex = 0;
$intTagPositions = array();
foreach($strTag[0] as $strFullTag) {
$intTagPositions[$intIndex] = array('start' => (strpos($strBody, $strFullTag, $intOffset)), 'end' => (strpos($strBody, $strFullTag, $intOffset) + strlen($strFullTag)));
$intOffset += strlen($strFullTag);
$intIndex++;
}
return $intTagPositions;
}
function arrayValRecursive($key, array $arr){
$val = array();
array_walk_recursive($arr, function($v, $k) use($key, &$val){
if($k == $key) array_push($val, $v);
});
return count($val) > 1 ? $val : array_pop($val);
}
$arrayOfPositions = getTagPositions($html,$go,$stop);
$arrayOfStart = arrayValRecursive('start', $arrayOfPositions); //print_r($arrayOfStart);
$arrayOfEnd = arrayValRecursive('end', $arrayOfPositions); //print_r($arrayOfEnd);
$offset = 0;
$range = $arrayOfStart[$i] + $offset;
$rangeEnd = $arrayOfEnd[$i];
echo '<br>'.$range.' to '.$rangeEnd.' is: <br>';
echo substr($html, $range, $rangeEnd);
答案 0 :(得分:1)
返回值
返回完整模式匹配的数量(可能为零),如果发生错误,则返回FALSE。
如果您想要偏移到字符串中,请使用PREG_OFFSET_CAPTURE
<强> PREG_OFFSET_CAPTURE 强>
如果传递此标志,则对于每个发生的匹配,还将返回附加字符串偏移量。请注意,这会将匹配的值更改为一个数组,其中每个元素都是一个数组,该数组由偏移量为0的匹配字符串和偏移量为1的主体的字符串偏移量组成。
以下是一个例子:
$count = preg_match_all('/\S+/', 'Hello, world!', $matches, PREG_OFFSET_CAPTURE);
echo "count=$count\n";
var_dump($matches);
这是输出
count=2
array(1) {
[0]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(6) "Hello,"
[1]=>
int(0)
}
[1]=>
array(2) {
[0]=>
string(6) "world!"
[1]=>
int(7)
}
}
}
您可以看到模式匹配$count=2
次。它匹配位置$matches[0][0][1]=0
的“你好”,它匹配“世界!”位置$matches[0][1][1]=7
以下是你如何循环所有比赛
$start = array();
$end = array();
foreach($matches[0] as $match) {
$start[] = $match[1];
$end[] = $match[1] + strlen($match[0]);
}