php - 如何捕获属于不同步骤/数组/位置的两个标签之间的多行正则表达式

标签 php regex tags tcpdf

我使用 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 中的所有文本都已格式化并且可以与上一个或下一个不同地打印

最佳答案

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

$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#]
        )

)

关于php - 如何捕获属于不同步骤/数组/位置的两个标签之间的多行正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56290661/

相关文章:

php - 检测 URL 是图像 URL 的最佳方法是什么?

php - PHP 5.4 对象取消引用是否成功缓解了此 DI 容器中静态存储参数的缺点?

php - 编辑默认 WordPress 密码重置电子邮件

.net - 包含所有可选部分但至少有一个必需部分的正则表达式

regex - 单击 Cypress 中的完全匹配文本

tags - 标记在组织上是否优于离散的子论坛?

html - 包含在一个 XML 元素或另一个 XML 元素中的字符串的 XPath?

php - 从复选框查询

Java - 从字符串中提取html信息

regex - 什么是正则表达式模式 "words with numbers in them"但不是数字本身