[英]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
'/$pattern1/'
意思是/$pattern1/
,而不是/ESSID: "([^\\]*)"/
; ESSID: "([^\\]*)"
是無效的正則表達式:反斜杠是轉義字符,因此它會在[ ]
之后轉義,但通過這種方式,先前的[
仍保持打開狀態。 正確的語法是[^\\]]*
,它的意思是:“搜索零個或多個字符,但不包括方括號”,但我認為您看到的不是您要搜索的字符串; preg_match()
返回1;否則,返回0;如果模式無效,則返回False。 匹配的值不是存儲在result中,而是存儲在第三個可選參數中,即數組。 因此,您可以使用以下語法:
$pattern1 = '/ESSID: "([^"]*)"/';
preg_match( $pattern1, $wedge, $SSID );
echo $SSID[1];
輸出為:
Openwrt
模式說明:
/
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.