PHP正则表达式以匹配HTML标签之外的关键字

我一直在尝试做一个正则表达式来匹配和替换HTML一部分上关键字的出现:

  1. 我想匹配keyword<span>keyword</span>
  2. 但是<a href="someurl.html" target="_blank">keyword</a>并且<a href="someur2.html">already linked keyword </a>不应该匹配

我只对keyword第一行的匹配(和替换)感兴趣。

我想要此操作的原因是将其替换keyword<a

href="dictionary.php?k=keyword">keyword</s>,但仅当keyword它尚未位于<a>标记中时才可以。

任何帮助都感激不尽!

回答:

我设法通过以下方式完成了我想做的事情( ):

  • 解析字符串的每个字符
  • 删除所有<a>标签(将它们复制到临时数组并在字符串上保留占位符)
  • str_replace 新字符串以替换所有关键字
  • 通过原始<a>标签重新填充占位符

如果有人需要,这是我使用的代码:

$str = <<<STRA

Moses supposes his toeses are roses,

but <a href="original-moses1.html">Moses</a> supposes erroneously;

for nobody's toeses are posies of roses,

as Moses supposes his toeses to be.

Ganda <span class="cenas"><a href="original-moses2.html" target="_blank">Moses</a></span>!

STRA;

$arr1 = str_split($str);

$arr_links = array();

$phrase_holder = '';

$current_a = 0;

$goto_arr_links = false;

$close_a = false;

foreach($arr1 as $k => $v)

{

if ($close_a == true)

{

if ($v == '>') {

$close_a = false;

}

continue;

}

if ($goto_arr_links == true)

{

$arr_links[$current_a] .= $v;

}

if ($v == '<' && $arr1[$k+1] == 'a') { /* <a */

// keep collecting every char until </a>

$arr_links[$current_a] .= $v;

$goto_arr_links = true;

} elseif ($v == '<' && $arr1[$k+1] == '/' && $arr1[$k+2] == 'a' && $arr1[$k+3] == '>' ) { /* </a> */

$arr_links[$current_a] .= "/a>";

$goto_arr_links = false;

$close_a = true;

$phrase_holder .= "{%$current_a%}"; /* put a parameter holder on the phrase */

$current_a++;

}

elseif ($goto_arr_links == false) {

$phrase_holder .= $v;

}

}

echo "Links Array:\n";

print_r($arr_links);

echo "\n\n\nPhrase Holder:\n";

echo $phrase_holder;

echo "\n\n\n(pre) Final Phrase (with my keyword replaced):\n";

$final_phrase = str_replace("Moses", "<a href=\"novo-mega-link.php\">Moses</a>", $phrase_holder);

echo $final_phrase;

echo "\n\n\nFinal Phrase:\n";

foreach($arr_links as $k => $v)

{

$final_phrase = str_replace("{%$k%}", $v, $final_phrase);

}

echo $final_phrase;

输出:

链接数组:

Array

(

[0] => <a href="original-moses1.html">Moses</a>

[1] => <a href="original-moses2.html" target="_blank">Moses</a>

)

词组:

Moses supposes his toeses are roses,

but {%0%} supposes erroneously;

for nobody's toeses are posies of roses,

as Moses supposes his toeses to be.

Ganda <span class="cenas">{%1%}</span>!

(上)最终词组(替换为我的关键字):

<a href="novo-mega-link.php">Moses</a> supposes his toeses are roses,

but {%0%} supposes erroneously;

for nobody's toeses are posies of roses,

as <a href="novo-mega-link.php">Moses</a> supposes his toeses to be.

Ganda <span class="cenas">{%1%}</span>!

<a href="novo-mega-link.php">Moses</a> supposes his toeses are roses,

but <a href="original-moses1.html">Moses</a> supposes erroneously;

for nobody's toeses are posies of roses,

as <a href="novo-mega-link.php">Moses</a> supposes his toeses to be.

Ganda <span class="cenas"><a href="original-moses2.html" target="_blank">Moses</a></span>!

以上是 PHP正则表达式以匹配HTML标签之外的关键字 的全部内容, 来源链接: utcz.com/qa/397338.html

回到顶部