使用PHP我需要一个tag name => tag URL
数组我需要以某种方式扫描文本输入(稍微大一点,博客文章)并找到文本中的所有标记名称并用URL替换它们链接。但是要使其复杂化,如果标记名称位于<h1>
,<h2>
或<code> and <pre>
标记内,则不会执行此操作。可能为了简化,我可以说它必须在<p>
标签内才能进行切换。
我不知道怎么做到这一点,我知道我需要正则表达式但是我现在有点失落,如果有人能帮助我,我会非常感激
因此PHP
标记会变为<a href="link here">PHP</a>
答案 0 :(得分:3)
您可以使用XML解析器,如:
$array_of_tags = (array) simplexml_load_string($html);
OR
$xml_object = simplexml_load_string($html);
第一种方法会以可搜索的数组为您提供标签。第二个将为您提供SimpleXMLElement对象。
然后,您可以使用简单的foreach循环迭代数组中的元素或引用SimpleXMLElement对象中的变量。看看W3C的simplexml_load_string教程非常直接。
答案 1 :(得分:1)
我不会使用正则表达式(我认为你不会这样做)但我认为你只需要在这个问题上采取措施。做一个foreach循环并保持布尔值以跟踪你何时在<h1> <h2> <code> or <pre>
内,如果你是,你发现需要更换的东西然后不要更换它,否则更换它。那有意义吗?如果你愿意,我可以更详细。但是travega的答案是最好的。
答案 2 :(得分:1)
一个简单的循环就足够了:
$post = 'My link to {tag1} is awesome, but not as awesome as my link to {tag2}';
$tags = array(
'tag1' => 'http://tag1.com',
'tag2' => 'http://tag2.com',
'tag3' => 'http://tag3.com',
);
foreach ($tags as $tag_name => $tag_val) {
$post = str_replace('{'.$tag_name.'}', "<a href='$tag_val'>$tag_name</a>", $post);
}
echo $post;
// outputs:
// My link to <a href='http://tag1.com'>tag1</a> is awesome, but not as awesome as my link to <a href='http://tag2.com'>tag2</a>
答案 3 :(得分:1)
我猜你排除了h1,h2,代码和pre标签没有嵌套,如果你在insert上解析那么我会这样做:
<(h1|h2|code|pre)>(.*?)</\1>
,将其替换为占位符,并将其作为placeholder => html code
绝对不是一个出色的解决方案,但只在插入帖子时这样做,这应该不是那么糟糕..