我正在从我的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
中返回空值。
我无法记住我在过去几周内更改了任何代码,但这确实有效。谁能告诉我我错过了什么?
答案 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);
除非您有充分的理由,否则您确实希望远离动态变量名称。数组几乎总是可取的。