2016-12-30 22 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