php5使用preg_match

时间:2016-03-30 12:26:11

标签: php php-5.6

我使用php5使用preg_match()来提取匹配数据。以前我们使用较低版本的php5并且使用ereg()用于相同目的。

以下是使用ereg的代码:

$wedge =shell_exec("iwinfo wlan0 info");
$pattern1='ESSID: "([^\]*)"';
ereg($pattern1, $wedge, $SSID);

所以 $ SSID 正在包含AP的SSID。

现在我改为preg_match()但我无法提取它。这就是:

$wedge =shell_exec("iwinfo wlan0 info");
$pattern1='ESSID: "([^\]*)"';
echo preg_match('/$pattern1/', $wedge, $SSID);

任何人都可以通过给出字符串的开头和结尾来帮助我如何在完整的字符串中提取SSID吗?

更新:iwinfo wlan0信息的输出将如下:

wlan0     ESSID: "Openwrt"

所以我期待的$ SSID输出是 Openwrt

此致 Sowmya

3 个答案:

答案 0 :(得分:2)

  1. 在php中,不会评估由单引号包装的文字,因此'/$pattern1/'字面意思是/$pattern1/,而不是/ESSID: "([^\]*)"/;
  2. ESSID: "([^\]*)"无效正则表达式:反斜杠是一个转义字符,因此它在]之后转义,但通过这种方式,之前的[仍然打开。正确的语法是[^\]]*,它意味着:“搜索除了关闭方括号之外的零或多个字符”,但我不认为你正在寻找这个,看到你的字符串;
  3. preg_match()如果找到匹配则返回1,否则返回0,如果模式无效则返回False。匹配的值不存储在结果中,而是存储在第三个可选参数中,即数组。
  4. 因此,您可以使用以下语法:

    $pattern1 = '/ESSID: "([^"]*)"/';
    preg_match( $pattern1, $wedge, $SSID );
    echo $SSID[1];
    

    ,输出为:

    Openwrt
    

    regex101 demo

    模式解释:

    /
    ESSID:      # literally “ESSID: ”
    "           # double quote
    ([^"]*)     # Group 1: zero-or-more characters except double quote
    "           # double quote
    /
    

    使用非贪婪的运算符,您可以通过以下方式简化模式:

    /ESSID: "(.*?)"/
    

    (.*?)表示:零或多个字符,但在模式中跟随(在您的情况下,双引号)。

答案 1 :(得分:0)

preg_match手册说:

  

如果模式与给定主题匹配,则preg_match()返回1,否则返回0;如果发生错误,则返回FALSE。

所以,你的echo preg_match('/$pattern1/', $wedge, $SSID);并没有做任何有用的事情。现在,PHP也无法用单引号识别您的变量(或正则表达式),因此必须将其更改为双引号:

preg_match("/$pattern1/", $wedge, $SSID)

var_dump()上尝试$SSID,查看返回的内容。如果它没有返回任何内容,请询问有关您的正则表达式的新问题。

答案 2 :(得分:0)

您可以查看此代码。

$wedge    = shell_exec( "iwinfo wlan0 info" );
$pattern1 = 'ESSID: "([^\]*)"';
$output   =  preg_match( '/$pattern1/', $wedge, $SSID, , PREG_OFFSET_CAPTURE );

print_r( $output );