Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中带数组的大海捞针_Php_Regex - Fatal编程技术网

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

使用PHP,我需要一个数组
标记名=>标记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同意。我想这两种方法都有一些需要学习的地方,但我总是主张投入一些额外的工作来学习“最佳实践”方法,以避免将来“重新学习”。)我只是在测试这个,似乎你必须把所有的东西都包装在一个标签里,所有的段落和标题等都必须在一个标签里,标签可以是任何名字,你知道有没有办法解决这个问题吗?我想我可以临时添加它们,这样就可以了,然后删除它