1

有一个$str字符串可能包含包含<a >link</a>标签的 html 文本。

我想将链接存储在数组中并在 $str 中设置适当的更改。

例如,使用此字符串:

$str="some text <a href='/review/'>review</a> here <a class='abc' href='/about/'>link2</a> hahaha";

我们得到:

linkArray[0]="<a href='/review/'>review</a>";
positionArray[0] = 10;//position of the first link in the string

linkArray[1]="<a class='abc' href='/about/'>link2</a>";
positionArray[1]=45;//position of the second link in the string

$changedStr="some text [[0]] here [[1]] hahaha";

有没有比使用 遍历整个字符串更快的方法(性能)for

4

2 回答 2

3

这可以通过 preg_match_all 和 PREG_OFFSET_CAPTURE FLAG 来完成。

例如

$str="some text <a href='/review/'>review</a> here <a class='abc' href='/about/'>link2</a> hahaha";
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",$str,$out,PREG_OFFSET_CAPTURE);

var_dump($out);

这里的输出数组是$outPREG_OFFSET_CAPTURE捕获模式开始的字符串中的偏移量。

上面的代码将输出:

array (size=2)0 => 

array (size=2)
  0 => 
    array (size=2)
      0 => string '<a href='/review/'>review</a>' (length=29)
      1 => int 10
  1 => 
    array (size=2)
      0 => string '<a class='abc' href='/about/'>link2</a>' (length=39)
      1 => int 45
1 => 

array (size=2)
  0 => 
    array (size=2)
      0 => string 'review' (length=6)
      1 => int 29
  1 => 
    array (size=2)
      0 => string 'link2' (length=5)
      1 => int 75

有关更多信息,您可以单击链接http://php.net/manual/en/function.preg-match-all.php

for $changedStr: 让 $out 成为 preg_match_all 的输出字符串

$count= 0;
foreach($out[0] as $result) {

$temp=preg_quote($result[0],'/');

$temp ="/".$temp."/";
$str =preg_replace($temp, "[[".$count."]]", $str,1);


$count++;   
}
var_dump($str);

这给出了输出:

string 'some text [[0]] here [[1]] hahaha' (length=33)
于 2013-09-04T11:01:20.350 回答
1

我会使用正则表达式来执行此操作,请检查:

http://weblogtoolscollection.com/regex/regex.php

在这里试试:

http://www.solmetra.com/scripts/regex/index.php

并使用这个:

http://php.net/manual/en/function.preg-match-all.php

找到最好的正则表达式来解决您可能发现的每种情况:preg_match_all,如果您正确设置模式,将返回一个包含您想要的每个链接的数组。

编辑:

在您的情况下,假设您想保留“ <a>”,这可能会起作用:

$array = array();    
preg_match_all('/<a.*.a>/', '{{your data}}', $arr, PREG_PATTERN_ORDER);

输入示例:

<a href="ciccio">test</a>
<a href="caio">Lkdlasdk</a>

llkdla

<a href="lol">xx</a>

使用上述正则表达式输出:

Array
(
    [0] => Array
        (
            [0] => <a href="ciccio">test</a>
            [1] => <a href="caio">Lkdlasdk</a>
            [2] => <a href="lol">xx</a>
        )

)

希望这可以帮助

于 2013-09-04T10:57:10.397 回答