在干草堆的针与在PHP的列阵

时间:2012-01-17 00:28:13

标签: php regex

使用PHP我需要一个tag name => tag URL数组我需要以某种方式扫描文本输入(稍微大一点,博客文章)并找到文本中的所有标记名称并用URL替换它们链接。但是要使其复杂化,如果标记名称位于<h1><h2><code> and <pre>标记内,则不会执行此操作。可能为了简化,我可以说它必须在<p>标签内才能进行切换。

我不知道怎么做到这一点,我知道我需要正则表达式但是我现在有点失落,如果有人能帮助我,我会非常感激

因此PHP标记会变为<a href="link here">PHP</a>

4 个答案:

答案 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上解析那么我会这样做:

  1. preg_replace_callback使用<(h1|h2|code|pre)>(.*?)</\1>,将其替换为占位符,并将其作为placeholder => html code
  2. 进行数组处理
  3. strtr替换代码
  4. strtr用原始代码替换占位符
  5. 绝对不是一个出色的解决方案,但只在插入帖子时这样做,这应该不是那么糟糕..