搜索转义引号时,preg_match返回null

时间:2017-04-27 19:19:24

标签: php regex wordpress

我正在从我的Wordpress数据库中检索一个字符串;我检索的字符串是一个纯文本字段,可以添加Wordpress库。字符串的一些示例如下:

<p>test</p><p>[gallery columns=\"2\" ids=\"705,729\"]</p>
<p>[gallery columns=\"2\" ids=\"696,694\"]</p>
<p>test</p>

我想检索ids=\"x,x\"字段中的数字。

我有以下代码:

for ($i = 1; $i<5; $i++) {
    $result = get_ids_per_category($i, getReferencesMapId());
    ${"idArray".$i} = array();
    foreach ($result as $res) {
        $subject = $res->description;
        $pattern = "/\[(.*?)\]/";
        preg_match($pattern,$subject,$matches);
        if ($matches[1]) {
            $subject2 = $matches[1];
            $pattern2 = '/ids=\\"(.*)\\"/';
            preg_match($pattern2, $subject2, $matches2);

            array_push( ${"idArray".$i}, $matches2);
        }
    }

    if (!empty(${"idArray".$i})) {
        ${"finalArray".$i} = array();
        foreach (${"idArray".$i} as $arr) {
            $newarray = explode(",",$arr[1]);
            foreach ($newarray as $item) {
                array_push( ${"finalArray".$i}, $item);
            }
        }
    }
}

如果我致电var_dump($subject2),则会返回以下结果:

\page-referentiemap.php:58:string 'gallery columns=\"2\" ids=\"477,476\"' (length=37)
\page-referentiemap.php:58:string 'gallery columns=\"1\" ids=\"690\"' (length=33)
\page-referentiemap.php:58:string 'gallery ids=\"688,689,690\"' (length=27)
\page-referentiemap.php:58:string 'gallery columns=\"2\" ids=\"697,698,699\"' (length=41)
\page-referentiemap.php:58:string 'gallery ids=\"702,701,703\"' (length=27)
\page-referentiemap.php:58:string 'gallery columns=\"2\" ids=\"696,694\"' (length=37)

到目前为止一直很好,但之后我创建正则表达式的行如下:

preg_match($pattern2, $subject2, $matches2);

将始终在$matches2中返回空值。

我无法记住我在过去几周内更改了任何代码,但这确实有效。谁能告诉我我错过了什么?

1 个答案:

答案 0 :(得分:1)

你需要两次逃避反斜杠。一次用于PHP,一次用于PCRE。试试这个:

$pattern2 = '/ids=\\\\"(.*)\\\\"/';

尽管如此,看起来你可以让这段代码更简单。显然我无法完全测试,但看起来这应该可行:

<?php
$ids = [];
for ($i = 1; $i<5; $i++) {
    $result = get_ids_per_category($i, getReferencesMapId());
    foreach ($result as $res) {
        $subject = $res->description;
        $pattern = '/\[.*?\\bids=\\\\"(\d+),(\d+)\\\\".*?\]/';
        if (preg_match($pattern,$subject,$matches)) {
            $ids[$i][] = [$matches[1], $matches[2]];
        }
    }
}

print_r($ids);

除非您有充分的理由,否则您确实希望远离动态变量名称。数组几乎总是可取的。