如何在两个不同 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 中对其进行修改或更改。
我使用 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 中对其进行修改或更改。