如何在字符串中查找js对象?

时间:2017-07-22 17:31:19

标签: php json regex preg-match-all

我试图编写一个正则表达式来查找字符串中的js对象。

$test = "var contactData = {
    'address': '',
    'email': '',
    'phone': '09121269001',
    'fax': ''
};";

preg_match_all('/^contactData\s[=:]\s{(.*)};$/m', $test, $matches, PREG_PATTERN_ORDER);
var_dump($matches);

这是我得到的结果。

array (size=2)
  0 => 
    array (size=0)
      empty
  1 => 
    array (size=0)
      empty

4 个答案:

答案 0 :(得分:1)

这将是正则表达式:

def is_element_present(driver, how, what):
    try:
        driver.find_element(by=how, value=what)
        return True
    except NoSuchElementException as e:
        try:
            driver.find_element(by=`xpath`, value=`next page xpath`).click()
            return True
        except NoSuchElementException as nse:
            return False

此处发布的概念证明: https://xrg.es/#12zb4f1

/\'(.*)\'\: \'(.*)\'/

Regex result

所以preg_match_all("/\'(.*)\'\: \'(.*)\'/", "$test", $matches, null, 0); = = $matches[1][2] 因此phone = = $matches[2][2]

答案 1 :(得分:1)

如果正则表达式是您想要的,那么我认为这是一个很好的解决方案。

http://www.phpliveregex.com/p/kOh

preg_match_all("/'(.*?)'/", $test, $Matches);

正如您从图片中看到的$match[0][1]是地址,[2][3]电子邮件等等。

enter image description here

<小时/> 如果您希望每个组都作为一个新变量,您可以使用以下代码来创建变量而不是使用该数组。

$test = "var contactData = {
    'address': 'foobar',
    'email': 'fofo@foo.com',
    'phone': '09121269001',
    'fax': '1234'
};";


preg_match_all("/'(.*?)'/", $test, $Matches);

foreach($Matches[1] as $val){
    $$val = next($Matches[1]);
}

echo $address . "\n" . $email ."\n" . $phone ."\n". $fax;

输出:

foobar
fofo@foo.com
09121269001
1234

https://3v4l.org/CMvYB

答案 2 :(得分:1)

m修饰符使锚点(^$)一次匹配1行。您的第一行也以var开头,因此您无法使用主要锚点,或者您需要添加它。您可以将s修饰符与上述方法中的任何一种一起使用,这样就可以了。

/contactData\s[=:]\s\{(.*)\};$/s

/^var contactData\s[=:]\s\{(.*)\};$/s

演示:https://regex101.com/r/xCE6UD/2/https://regex101.com/r/xCE6UD/1/

你也应该逃避{}。当.*为贪婪时,您将匹配字符串中的最后一个},如果您有多个JSON字符串则不正确。另一种方法也可以是:

contactData\s[=:]\s\{([^}]+)};$

https://regex101.com/r/xCE6UD/3/

答案 3 :(得分:0)

json_decode()专门设计用于执行此任务时,禁止使用正则表达式解析json对象。它只需要在解码之前准备好字符串。 json_decode()完成了准备易于访问的关联数组的所有必要工作。

以下代码段将首先为您提供最终结果,然后 Tarantino 它将为您提供导致它的所有步骤。

代码:(Demo

$test = "var contactData = {
    'address': '',
    'email': '',
    'phone': '09121269001',
    'fax': ''
};";
// step #4 / final output -> use json_decode to generate associative array:
var_export(json_decode(rtrim(strstr(str_replace("'",'"',$test),'{'),';'),true));

echo "\n\n";
// step #1 -> swap single quotes for double quotes:
var_export(str_replace("'",'"',$test));
echo "\n";
// step #2 -> extract json object start to end of string:
var_export(strstr(str_replace("'",'"',$test),'{'));
echo "\n";
// step #3 -> trim trailing semi-colon from substring (several funcs can do this part)
var_export(rtrim(strstr(str_replace("'",'"',$test),'{'),';'));

输出:

array (
  'address' => '',
  'email' => '',
  'phone' => '09121269001',
  'fax' => '',
)

'var contactData = {
    "address": "",
    "email": "",
    "phone": "09121269001",
    "fax": ""
};'
'{
    "address": "",
    "email": "",
    "phone": "09121269001",
    "fax": ""
};'
'{
    "address": "",
    "email": "",
    "phone": "09121269001",
    "fax": ""
}'