如何在两个不同 steps/array/place 的标签之间捕获多行正则表达式

How to capture multiline regex between two tags that are into different steps/array/place

我使用 TCPDF 生成一些复杂的 PDF,所以问题出在 PDF 中而不是标准网页中

我正在尝试获取 2 个标签之间的文本,包括以下两个标签:[#SCHANGE#][#ECHANGE#]

我正在使用这个正则表达式:

preg_match('/(?:\[#SCHANGE#\]((?:.*?\r?\n?)*)\[#ECHANGE#\])+/m', $textV, $StartEndChange);

$textV 是来自 foreach 循环的动态值,例如:

foreach($text as $textV){

    //some code here..

}

里面可以有不同的情况比如:

$text = array (
    "0" => "[#SCHANGE#] same text [#ECHANGE#]" //This is okay, regex works in this case
) ;

但是当 $text 只有一个标签时,这个正则表达式不起作用,然后我遇到了这种情况:

$text = array (
    "0" => "[#SCHANGE#]same text",
    "1" => "some text",
    "2" => "some text",
    "3" => "some text",
    "4" => "some text",
    "5" => "some text",
    "6" => "some text",
    "7" => "some text [#ECHANGE#]"
) ;

那么:如果两个标签不在同一个文本中,我如何获取两个标签之间的文本?

我无法展开数组,因为 $text 中的所有文本都已格式化并且可以与上一个或下一个不同地打印

你原来的表情很接近。我们可能只是想以(\[#SCHANGE#\])(\[#ECHANGE#\])作为左右边界,然后收集我们的"some text",也许表达式类似于:

(\[#SCHANGE#\])(.+?)(\[#ECHANGE#\])

测试

$re = '/(\[#SCHANGE#\])(.+?)(\[#ECHANGE#\])/m';
$str = '[#SCHANGE#] same text 1 [#ECHANGE#]
[#SCHANGE#] same text 2 [#ECHANGE#]
[#SCHANGE#] same text 3 [#ECHANGE#]
[#SCHANGE#] same text 4 [#ECHANGE#][#SCHANGE#] same text 5 [#ECHANGE#]';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$arr = array();
foreach ($matches as $key => $value) {$arr[$key] = $value[0];}
var_dump($arr);

输出

array(5) {
  [0]=>
  string(35) "[#SCHANGE#] same text 1 [#ECHANGE#]"
  [1]=>
  string(35) "[#SCHANGE#] same text 2 [#ECHANGE#]"
  [2]=>
  string(35) "[#SCHANGE#] same text 3 [#ECHANGE#]"
  [3]=>
  string(35) "[#SCHANGE#] same text 4 [#ECHANGE#]"
  [4]=>
  string(35) "[#SCHANGE#] same text 5 [#ECHANGE#]"
}

正则表达式

如果不需要此表达式,可以在 regex101.com 中对其进行修改或更改。

正则表达式电路

jex.im 可视化正则表达式:

我会先分解数组,然后在字符串中搜索:

$text = array (
    "[#SCHANGE#]same text",
    "some text",
    "some text",
    "some text",
    "some text",
    "some text",
    "some text",
    "some text [#ECHANGE#]",
    "blah blah",
    "[#SCHANGE#]other text[#ECHANGE#]"
) ;

$all_text = implode("\n", $text);
preg_match_all('/\[#SCHANGE#\][\s\S]+?\[#ECHANGE#\]/', $all_text, $matches);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => [#SCHANGE#]same text
some text
some text
some text
some text
some text
some text
some text [#ECHANGE#]
            [1] => [#SCHANGE#]other text[#ECHANGE#]
        )

)

试试这个:

$re = '/(\[#SCHANGE#\](.+?)\[#ECHANGE#\])|(\[#SCHANGE#\](.+?$))|(^(.+?)\[#ECHANGE#\])/m';

$str = '[#SCHANGE#]same text
some text [#ECHANGE#]
[#SCHANGE#] same text [#ECHANGE#]';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

正则表达式

如果不需要此表达式,可以在 regex101.com 中对其进行修改或更改。