PHP中带数组的大海捞针
使用PHP,我需要一个数组PHP中带数组的大海捞针,php,regex,Php,Regex,使用PHP,我需要一个数组标记名=>标记URL,我需要以某种方式扫描文本输入(会有点大,一篇博客文章),然后在文本中找到所有标记名,并用URL链接替换它们。但更复杂的是,如果标记名位于、、或和标记内,则不会执行此操作。可能为了简化,我可以说它必须在一个标记中才能进行切换 $post = 'My link to {tag1} is awesome, but not as awesome as my link to {tag2}'; $tags = array( 'tag1' => 'h
标记名=>标记URL
,我需要以某种方式扫描文本输入(会有点大,一篇博客文章),然后在文本中找到所有标记名,并用URL链接替换它们。但更复杂的是,如果标记名位于
、
、或和标记内,则不会执行此操作。可能为了简化,我可以说它必须在一个
标记中才能进行切换
$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>
我不知道如何做到这一点,我知道我将需要正则表达式,但我现在有点迷失,如果有人能帮我一些我会非常感激
所以一个PHP
标签会变成
我不会使用正则表达式(我想你也不能),但我想你只需要在这个问题上认真考虑一下。执行foreach循环并保持布尔值,以跟踪您何时在或中,如果您在其中并且发现需要更换的东西,则不要更换,否则请更换。这有意义吗?如果你愿意,我可以更详细地了解。但特拉维加的答案是最好的。我不会使用正则表达式(我认为你也不能),但我认为你只需要在这一个问题上着手解决。执行foreach循环并保持布尔值,以跟踪您何时在或中,如果您在其中并且发现需要更换的东西,则不要更换,否则请更换。这有意义吗?如果你愿意,我可以更详细地了解。但特拉维加的答案是最好的。这里一个简单的循环就足够了:
$xml_object = simplexml_load_string($html);
$post='我到{tag1}的链接很棒,但没有我到{tag2}的链接那么棒';
$tags=数组(
'tag1'=>'http://tag1.com',
'tag2'=>'http://tag2.com',
'tag3'=>'http://tag3.com',
);
foreach($tags as$tag\u name=>$tag\u val){
$post=str_replace(“{”。$tag_name.'}”,”,$post);
}
echo$post;
//产出:
//我的链接非常棒,但没有我的链接那么棒
在这里,一个简单的循环就足够了:
$xml_object = simplexml_load_string($html);
$post='我到{tag1}的链接很棒,但没有我到{tag2}的链接那么棒';
$tags=数组(
'tag1'=>'http://tag1.com',
'tag2'=>'http://tag2.com',
'tag3'=>'http://tag3.com',
);
foreach($tags as$tag\u name=>$tag\u val){
$post=str_replace(“{”。$tag_name.'}”,”,$post);
}
echo$post;
//产出:
//我的链接非常棒,但没有我的链接那么棒
您可以使用如下XML解析器:
或
第一种方法将在一个可搜索的数组中为您提供标记。第二个将为您提供一个SimpleXMLElement对象
然后,您可以使用简单的foreach循环来迭代数组中的元素或引用SimpleXMLElement对象中的变量。看看W3C的教程,它非常简单。您可以使用如下XML解析器:
或
第一种方法将在一个可搜索的数组中为您提供标记。第二个将为您提供一个SimpleXMLElement对象
然后,您可以使用简单的foreach循环来迭代数组中的元素或引用SimpleXMLElement对象中的变量。请看一下W3C的教程,它非常直截了当。我想您排除了h1、h2,代码和pre标记没有嵌套,如果您在insert上进行解析,那么我会:
使用(.*)
,将它们替换为占位符,并将它们按占位符=>html代码的形式排列到数组中
替换标签
用原始代码替换占位符的步骤
显然,这不是一个很好的解决方案,但仅在插入post时执行此操作,这应该不会太糟糕。我猜您排除了h1、h2,代码和pre标记没有嵌套,如果您在插入时执行解析,那么我将执行以下操作:
使用(.*)
,将它们替换为占位符,并将它们按占位符=>html代码的形式排列到数组中
替换标签
用原始代码替换占位符的步骤
显然,这不是一个很好的解决方案,但只在插入帖子时才这样做,这应该不会太糟糕。您是如何得出使用正则表达式来实现这一点的结论的?与您之前的一个问题相关:您是如何得出使用regex进行此操作的结论的?与您之前的一个问题相关:@kristian您是对的,但这是一种黑客行为,因为它查找的是{tag1}
而不是标记
,因此在其他标记中,您不会执行{tag1}
method@Kristian你说得对。我只是想证明,不需要更严肃的解决方案,简单的更换是可以管理的。。。不过,我通常会推荐DOM解析。@kristian你是对的,但这是一种黑客行为,因为它寻找的是{tag1}
而不是标记
,所以在那些其他标记中,你不会做{tag1}
method@Kristian你说得对。我只是想证明,不需要更严肃的解决方案,简单的更换是可以管理的。。。然而,我通常会推荐DOM解析,我认为这是一种方法,可能与rdlowrey的答案+1结合使用,因为DOM始终是解析/编辑(X)HTML标记的首选方法。然而,如果有人正在寻找一个简单的解决方案,甚至对基本循环或正则表达式都不满意,这可能是一个很大的问题。另外,如果需要替换,我建议使用DOM而不是SimpleXML,因为SimpleXML是为读取和迭代而优化的,而不是DOM操作。@rdlowrey同意。我想这两种方法都有一些需要学习的地方,但我总是主张投入一些额外的工作来学习“最佳实践”方法,以避免将来“重新学习”。)我只是在测试这个,似乎你必须把所有的东西都包装在一个标签里,所有的段落和标题等都必须在一个标签里,标签可以是任何名字,你知道有没有办法解决这个问题吗?我想我可以临时添加它们,这样就可以了,然后删除它