使用PHP Regex从类JSON字符串中提取字段值

2jcobegt  于 2023-10-22  发布在  PHP
关注(0)|答案(1)|浏览(148)

我需要通过正则表达式提取JSON字段的值,(我不能使用JSON解码)。
对于这个字符串:

"url":"http://stackoverflow.com/orwell", "domain":"netcharles.com", "title":"Orwell Essays & Journalism Section - Charles George Orwell Links", "tags":["orwell","writing","literature","journalism","essays","politics","essay","reference","language","toread"], "index":2931, "time_created":1345419323, "num_saves":24

我想得到domain的值,我找到了this和其他一些解决方案,当我在regex101中测试它们时,它们几乎可以工作,但当使用PHP时,它们didn't work as expected;知道为什么吗!
字符串可以在逗号之后和双引号之前有空格,也可以没有。

更新:

字符串不完全是json,也不足以通过添加括号将其转换为json,只有一部分字符串像json。
它总是包含像"name": "david","email": "some email"这样的东西,我需要从那部分获取数据,string的结构是
(anything here) "field1": "value1", "field2":"value2" (anything here)

jv2fixgn

jv2fixgn1#

这只是你的模式中反斜线的数量的问题。我知道,这是相当奇怪的,因为你可以有效地编写一个PHP单引号字符串,如'\s'和反斜杠将被视为反斜杠。但是如果你写'\\s',它将包含相同的字符串。所以有时候,为了在PHP中更容易地创建正则表达式,可以使用nowdoc语法。
nowdoc语法将按字面意思处理字符串,因此反斜杠将被视为它们。就像单引号字符串一样,它也不计算其内容,因此不查找其内容中的变量,与双引号字符串或heredoc语法相反。
它使用nowdoc语法处理以下代码,以便更好地理解正则表达式:

<?php

$subject = '"url":"http://www.netcharles.com/orwell/essays.htm", "domain":"netcharles.com", "title":"Orwell Essays & Journalism Section - Charles George Orwell Links", "tags":["orwell","writing","literature","journalism","essays","politics","essay","reference","language","toread"], "index":2931, "time_created":1345419323, "num_saves":24';

$pattern= <<<'END_OF_PATTERN'
/"domain"\s*:\s*"((?:\\"|[^"])*)"/i
END_OF_PATTERN;

$success = preg_match($pattern, $subject, $match);
if ($success) {
    var_dump($match) ;
} else {
    echo 'not match';
}

我删除了“domain”周围的第一个捕获组,因为没有必要捕获它。我还在内部重复捕获组中添加了?:,使其成为非捕获组。我看不出有任何理由获得域值的最后一个字符。
您还可以使用(?<group_name> )创建命名捕获组。这就是我在这里做的:https://onlinephp.io/c/9b024

相关问题