2012-04-19 44 views
0

我怎樣才能既(http://[^"]+)的?:匹配 有沒有辦法匹配遞歸/嵌套正則表達式? (PHP,preg_match_all)

<a href="http://yoursite.com/goto/http://aredirectURL.com/extraqueries"></a> 

(我知道這是非法URL,但同樣的想法)

我想正則表達式給我這兩比賽:

1 http://yoursite.com/goto/http://aredirectURL.com/extraqueries 
2 http://aredirectURL.com/extraqueries 

無運行多個preg_match_all的

真的難住了,爲感謝任何光線都可以流下。

+0

任意嵌套,或最多兩個? (前者是不可能的,只有一個PHP正則表達式。) – Ryan 2012-04-19 23:05:15

+2

@minitech [遞歸正則表達式man!](http://stackoverflow.com/a/3180176/31671):P – alex 2012-04-19 23:15:32

+1

@alex:呃...哇。 – Ryan 2012-04-19 23:17:29

回答

1

這個正則表達式會得到你想要的輸出:((?:http://[^"]+)(http://[^"]+))。請注意非捕獲組(?:regex)的使用情況。要閱讀有關非捕獲組的更多信息,請參見Regular Expression Advanced Syntax Reference

<?php 
preg_match_all(
    '((?:http://[^"]+)(http://[^"]+))', 
    '<a href="http://yoursite.com/goto/http://aredirectURL.com/extraqueries"></a>', 
    $out); 
echo "<pre>"; 
print_r($out); 
echo "</pre>"; 
?> 

上述代碼輸出以下:

Array 
(
    [0] => Array 
     (
      [0] => http://yoursite.com/goto/http://aredirectURL.com/extraqueries 
     ) 

    [1] => Array 
     (
      [0] => http://aredirectURL.com/extraqueries 
     ) 

) 
+0

完美,謝謝!這個是我最終做的:'/((?: http [^ \「\'\ s>] +)?(http [^ \」\'\ s>] +))/ gism' – tweak2 2012-04-19 23:50:43

0

可以在該功能分割字符串:

http://de.php.net/preg_split

每個部分可以包含例如結果中給出的數組中的一個網址。

如果有更多的內容,可以在全文「工作」的時候使用回調操作調用preg_split。

0
$str = '<a href="http://yoursite.com/goto/http://aredirectURL.com/extraqueries"></a>'; 

preg_match("/\"(http:\/\/.*?)(http:\/\/.*?)\"/i", $str, $match); 

echo "{$match[0]}{$match[1]}\n"; 
echo "{$match[1]}\n"; 
相關問題