2016-12-30 65 views
1

我想能夠提取字符串的某些部分並返回唯一數組。這裏是我的字符串:使用Php preg_match多次發生,返回唯一數組

$string = " 
    <div> some text goes here... **css/method|1|2**</div> 
    <div>**php/method|3|4**</div> 
    <div>**html|method|6|9** and more text here</div> 
    <div>**html/method|2|5**</div> 
"; 

preg_match_all()

$pattern = "/**(.*?)**/"; 
preg_match_all($pattern, $string, $matches); 

我可以提取所有字符串中的部分,但我需要進一步走一步,只返回以下內容:

CSS ,PHP和HTML。

最終陣列應該是這樣的:

$result = array("css", "php", "html"); 

所以基本上,我需要在這種情況下,「HTML」,以消除重複值,以及提取反斜槓或管之前的每個值。我不關心方法部分以及後續部分。

+0

'*'在正則表達式的特殊含義,你需要躲避他們的。 – Barmar

回答

1

使用preg_match_allarray_unique函數的溶液:

preg_match_all("~\*\*([^/|*]+)(?=[/|])~", $string, $matches); 
$result = array_unique($matches[1]); 
print_r($result); 

輸出:

Array 
(
    [0] => css 
    [1] => php 
    [2] => html 
) 

(?=[/|]) - 陽性預測先行斷言相匹配詞,之後是字符之一/|


更新:忽略來自匹配更新正則表達式的標籤有以下~\*\*([^/|*<>]+)(?=[/|])~

+0

是的,你說得對。我刪除了我的帖子,我不明白你發佈的(?= [/ |])。 –

+0

@RomanPerekhrest,感謝這很好,但由於某種原因,如果我在代碼中有額外的HTML或文本,它不起作用。例如「Lorem ipsum ** css/method | 1 | 2 ** dolores ...」 – Alko

+1

@KrisRoofe,添加了一些解釋 – RomanPerekhrest