簡體   English   中英

php5 preg_match的用法

[英]php5 usage of preg_match

我正在使用使用preg_match()的php5在比賽中提取數據。 以前,我們使用較低版本的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 info的輸出將如下所示:

wlan0     ESSID: "Openwrt"

所以我期望的$ SSID的輸出是Openwrt

問候,Sowmya

  1. 在php中,不對用單引號引起來的文本進行求值,因此'/$pattern1/'意思是/$pattern1/ ,而不是/ESSID: "([^\\]*)"/ ;
  2. ESSID: "([^\\]*)"是無效的正則表達式:反斜杠是轉義字符,因此它會在[ ]之后轉義,但通過這種方式,先前的[仍保持打開狀態。 正確的語法是[^\\]]* ,它的意思是:“搜索零個或多個字符,但不包括方括號”,但我認為您看到的不是您要搜索的字符串;
  3. 如果找到匹配項,則preg_match()返回1;否則,返回0;如果模式無效,則返回False。 匹配的值不是存儲在result中,而是存儲在第三個可選參數中,即數組。

因此,您可以使用以下語法:

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

輸出為:

Openwrt

regex101演示

模式說明:

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

使用非貪婪運算符,您可以通過以下方式簡化模式:

/ESSID: "(.*?)"/

(.*?)意思是:零個或多個字符,除了模式中的以下字符(在您的情況下為雙引號)。

preg_match的手冊說:

如果模式匹配給定的主題,則preg_match()返回1;如果不匹配,則返回0;如果發生錯誤,則返回FALSE。

因此,您的echo preg_match('/$pattern1/', $wedge, $SSID); 沒有任何用處。 現在,PHP也無法識別單引號中的變量(或正則表達式),因此必須將其更改為雙引號:

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

$SSID上嘗試var_dump() ,看看會返回什么。 如果它不返回任何內容,請詢問一個與您的正則表達式有關的新問題。

您可以檢查此代碼。

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

print_r( $output );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM