Php 获取之间的字符串-查找所有匹配项

Php 获取之间的字符串-查找所有匹配项,php,Php,它在两个文本字符串(html或其他)之间查找数据 如何更改它以查找所有事件?每次出现$start[一些随机数据]$end之间的每个数据。我想要文档的所有[一些随机数据](总是不同的数据) 一种可能的办法: function getContents($str, $startDelimiter, $endDelimiter) { $contents = array(); $startDelimiterLength = strlen($startDelimiter); $endDelimi

它在两个文本字符串(html或其他)之间查找数据

如何更改它以查找所有事件?每次出现$start[一些随机数据]$end之间的每个数据。我想要文档的所有[一些随机数据](总是不同的数据)

一种可能的办法:

function getContents($str, $startDelimiter, $endDelimiter) {
  $contents = array();
  $startDelimiterLength = strlen($startDelimiter);
  $endDelimiterLength = strlen($endDelimiter);
  $startFrom = $contentStart = $contentEnd = 0;
  while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
    $contentStart += $startDelimiterLength;
    $contentEnd = strpos($str, $endDelimiter, $contentStart);
    if (false === $contentEnd) {
      break;
    }
    $contents[] = substr($str, $contentStart, $contentEnd - $contentStart);
    $startFrom = $contentEnd + $endDelimiterLength;
  }

  return $contents;
}
用法:

$sample = '<start>One<end>aaa<start>TwoTwo<end>Three<start>Four<end><start>Five<end>';
print_r( getContents($sample, '<start>', '<end>') );
/*
Array
(
    [0] => One
    [1] => TwoTwo
    [2] => Four
    [3] => Five
)
*/ 
    $str = "Bore layer thickness [2 mm] instead of [1,25 mm] with [0,1 mm] deviation.";
    $cas = get_delimited_strings($str, "[", "]");
$sample='oneaaatwotwoThreeFour5';
打印(获取内容($sample,,'');
/*
排列
(
[0]=>一个
[1] =>two-two
[2] =>四个
[3] =>五个
)
*/ 

.

您可以使用regex执行此操作:

function getStringsBetween($string, $start, $end)
{
    $pattern = sprintf(
        '/%s(.*?)%s/',
        preg_quote($start),
        preg_quote($end)
    );
    preg_match_all($pattern, $string, $matches);

    return $matches[1];
}

我还需要模式之外的文本。所以我把答案从上面的raina77ow改了一点:

function get_delimited_strings($str, $startDelimiter, $endDelimiter) {
    $contents = array();
    $startDelimiterLength = strlen($startDelimiter);
    $endDelimiterLength = strlen($endDelimiter);
    $startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0;
    while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
        $contentStart += $startDelimiterLength;
        $contentEnd = strpos($str, $endDelimiter, $contentStart);
        $outEnd = $contentStart - 1;
        if (false === $contentEnd) {
            break;
        }
        $contents['in'][] = substr($str, $contentStart, $contentEnd - $contentStart);
        $contents['out'][] = substr($str, $outStart, $outEnd - $outStart);
        $startFrom = $contentEnd + $endDelimiterLength;
        $outStart = $startFrom;
    }
    $contents['out'][] = substr($str, $outStart, $contentEnd - $outStart);
    return $contents;
}
用法:

$sample = '<start>One<end>aaa<start>TwoTwo<end>Three<start>Four<end><start>Five<end>';
print_r( getContents($sample, '<start>', '<end>') );
/*
Array
(
    [0] => One
    [1] => TwoTwo
    [2] => Four
    [3] => Five
)
*/ 
    $str = "Bore layer thickness [2 mm] instead of [1,25 mm] with [0,1 mm] deviation.";
    $cas = get_delimited_strings($str, "[", "]");
给出:

array(2) { 
    ["in"]=> array(3) { 
        [0]=> string(4) "2 mm" 
        [1]=> string(7) "1,25 mm" 
        [2]=> string(6) "0,1 mm" 
    } 
    ["out"]=> array(4) { 
        [0]=> string(21) "Bore layer thickness " 
        [1]=> string(12) " instead of " 
        [2]=> string(6) " with " 
        [3]=> string(10) " deviation" 
    } 
}

我需要找到特定的第一个和最后一个标记之间的所有这些事件,并以某种方式更改它们,然后返回更改的字符串

因此,我在函数之后向raina77ow方法添加了这个小代码

        $sample = '<start>One<end> aaa <start>TwoTwo<end> Three <start>Four<end> aaaaa <start>Five<end>';
        $sample_temp = getContents($sample, '<start>', '<end>');
        $i = 1;
        foreach($sample_temp as $value) {
            $value2 = $value.'-'.$i; //there you can change the variable
            $sample=str_replace('<start>'.$value.'<end>',$value2,$sample);
            $i = ++$i;
        }
        echo $sample;
$sample='1aaa2234aaaaa5';
$sample_temp=getContents($sample,,'');
$i=1;
foreach($value作为$sample_temp){
$value2=$value.'-'.$i;//在那里可以更改变量
$sample=str_replace(“.$value.”,$value2,$sample);
$i=+$i;
}
echo$样本;
现在,output sample已删除标记,它们之间的所有字符串都添加了如下编号:

1-1 aaa 2-2-3 aaa 5-4


但是你可以对他们做任何其他的事情。也许对某人会有帮助。

我喜欢用explode在两条线之间画线。此函数也适用于多次出现

function GetIn($str,$start,$end){
    $p1 = explode($start,$str);
    for($i=1;$i<count($p1);$i++){
        $p2 = explode($end,$p1[$i]);
        $p[] = $p2[0];
    }
    return $p;
}
函数GetIn($str,$start,$end){ $p1=爆炸($start$str);
对于($i=1;$i这里有一些很好的解决方案,但是对于从HTML中提取部分代码,这是我现在的问题,因为我需要在压缩HTML之前从HTML中提取脚本块。因此,在@raina77ow original solution的基础上,由@Cas Tuyn扩展,我得到了这个解决方案:

$test_strings = [
    '0<p>a</p>1<p>b</p>2<p>c</p>3',
    '0<p>a</p>1<p>b</p>2<p>c</p>',
    '<p>a</p>1<p>b</p>2<p>c</p>3',
    '<p>a</p>1<p>b</p>2<p>c</p>',
    '<p></p>1<p>b'
];

/**
* Seperate a block of code by sub blocks. Example, removing all <script>...<script> tags from HTML kode
* 
* @param string $str, text block
* @param string $startDelimiter, string to match for start of block to be extracted
* @param string $endDelimiter, string to match for ending the block to be extracted
* @return array [all full blocks, whats left of string]
*/
function getDelimitedStrings($str, $startDelimiter, $endDelimiter) {
    $contents = array();
    $startDelimiterLength = strlen($startDelimiter);
    $endDelimiterLength = strlen($endDelimiter);
    $startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0;
    while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
        $contentStart += $startDelimiterLength;
        $contentEnd = strpos($str, $endDelimiter, $contentStart);
        $outEnd = $contentStart - 1;
        if (false === $contentEnd) {
            break;
        }
        $contents['in'][] = substr($str, ($contentStart-$startDelimiterLength), ($contentEnd + ($startDelimiterLength*2) +1) - $contentStart);
        if( $outStart ){
            $contents['out'][] = substr($str, ($outStart+$startDelimiterLength+1), $outEnd - $outStart - ($startDelimiterLength*2));
        } else if( ($outEnd - $outStart - ($startDelimiterLength-1)) > 0 ){
            $contents['out'][] = substr($str, $outStart, $outEnd - $outStart - ($startDelimiterLength-1));
        }
        $startFrom = $contentEnd + $endDelimiterLength;
        $startFrom = $contentEnd;
        $outStart = $startFrom;
    }
    $total_length = strlen($str);
    $current_position = $outStart + $startDelimiterLength + 1;
    if( $current_position < $total_length )
        $contents['out'][] = substr($str, $current_position);

    return $contents;
}

foreach($test_strings AS $string){
    var_dump( getDelimitedStrings($string, '<p>', '</p>') );
}
$test\u字符串=[
“0a

1b

2c

3”, “0a

1b

2c

”, “a

1b

2c

3”, “a

1b

2c

”, “

1b” ]; /** *按子块分隔代码块。例如,从HTML kode中删除所有…标记 * *@param string$str,文本块 *@param string$startDelimiter,与要提取的块的开头匹配的字符串 *@param string$endDelimiter,用于结束要提取的块的匹配字符串 *@return数组[全部满块,字符串剩余部分] */ 函数getDelimitedString($str、$startDelimiter、$endDelimiter){ $contents=array(); $startDelimiterLength=strlen($startDelimiter); $endDelimiterLength=strlen($endDelimiter); $startFrom=$contentStart=$contentEnd=$outStart=$outEnd=0; while(false!==($contentStart=strpos($str、$startDelimiter、$startFrom))){ $contentStart+=$startDelimiterLength; $contentEnd=strpos($str,$endDelimiter,$contentStart); $outEnd=$contentStart-1; if(false==$contentEnd){ 打破 } $contents['in'][]=substr($contentStart-$startDelimiterLength),($contentEnd+($startDelimiterLength*2)+1)-$contentStart); 如果($超过部分){ $contents['out'][]=substr($str,($outStart+$startDelimiterLength+1),$outEnd-$outStart-($startDelimiterLength*2)); }如果($outEnd-$outStart-($startDelimiterLength-1))>0,则为else{ $contents['out'][]=substr($str,$outStart,$outEnd-$outStart-($startDelimiterLength-1)); } $startFrom=$contentEnd+$endDelimiterLength; $startFrom=$contentEnd; $outStart=$startFrom; } $total_length=strlen($str); $current_position=$outStart+$startDelimiterLength+1; if($当前位置<$总长度) $contents['out'][]=substr($str,$current_position); 返回$contents; } foreach($test_字符串作为$string){ 变量转储(getDelimitedString($string,“”,“

”); }
这将使用可能的innerHTML提取所有元素,并给出以下结果:

array (size=2)
'in' => array (size=3)
    0 => string '<p>a</p>' (length=8)
    1 => string '<p>b</p>' (length=8)
    2 => string '<p>c</p>' (length=8)
'out' => array (size=4)
    0 => string '0' (length=1)
    1 => string '1' (length=1)
    2 => string '2' (length=1)
    3 => string '3' (length=1)

array (size=2)
'in' => array (size=3)
    0 => string '<p>a</p>' (length=8)
    1 => string '<p>b</p>' (length=8)
    2 => string '<p>c</p>' (length=8)
'out' => array (size=3)
    0 => string '0' (length=1)
    1 => string '1' (length=1)
    2 => string '2' (length=1)

array (size=2)
'in' => array (size=3)
    0 => string '<p>a</p>' (length=8)
    1 => string '<p>b</p>' (length=8)
    2 => string '<p>c</p>' (length=8)
'out' => array (size=3)
    0 => string '1' (length=1)
    1 => string '2' (length=1)
    2 => string '3' (length=1)

array (size=2)
'in' => array (size=3)
    0 => string '<p>a</p>' (length=8)
    1 => string '<p>b</p>' (length=8)
    2 => string '<p>c</p>' (length=8)
'out' => array (size=2)
    0 => string '1' (length=1)
    1 => string '2' (length=1)

array (size=2)
'in' => array (size=1)
    0 => string '<p></p>' (length=7)
'out' => array (size=1)
    0 => string '1<p>b' (length=5)
数组(大小=2)
'在'=>数组中(大小=3)
0=>字符串“a

”(长度=8) 1=>字符串“b

”(长度=8) 2=>字符串“c

”(长度=8) 'out'=>数组(大小=4) 0=>字符串“0”(长度=1) 1=>字符串“1”(长度=1) 2=>字符串“2”(长度=1) 3=>字符串“3”(长度=1) 数组(大小=2) '在'=>数组中(大小=3) 0=>字符串“a

”(长度=8) 1=>字符串“b

”(长度=8) 2=>字符串“c

”(长度=8) 'out'=>数组(大小=3) 0=>字符串“0”(长度=1) 1=>字符串“1”(长度=1) 2=>字符串“2”(长度=1) 数组(大小=2) '在'=>数组中(大小=3) 0=>字符串“a

”(长度=8) 1=>字符串“b

”(长度=8) 2=>字符串“c

”(长度=8) 'out'=>数组(大小=3) 0=>字符串“1”(长度=1) 1=>字符串“2”(长度=1) 2=>字符串“3”(长度=1) 数组(大小=2) '在'=>数组中(大小=3) 0=>字符串“a

”(长度=8) 1=>字符串“b

”(长度=8) 2=>字符串“c

”(长度=8) 'out'=>数组(大小=2) 0=>字符串“1”(长度=1) 1=>字符串“2”(长度=1) 数组(大小=2) '在'=>数组中(大小=1) 0=>字符串“

”(长度=7) 'out'=>数组(大小=1) 0=>字符串“1b”(长度=5)

您可以在这里看到一个演示:

您需要数据(字符串)吗您文档的计数器??要捕获更多,您需要转到正则表达式。请参阅我查看了preg_match_all,但我不知道如何生成正则表达式。Rajib-我不知道您的意思?我希望函数返回一个引用数组。如果数据看起来像
STARTfooSTARTbarENDbazEND
,您希望函数做什么?谢谢你太多了!正是我想要的!你救了我的命,伙计!或者至少花了很多时间测试和重新测试xP。非常感谢!:)有人能解释一下吗