【问题标题】:PHP preg_replace to insert string inside an existing stringPHP preg_replace 在现有字符串中插入字符串
【发布时间】:2012-11-13 13:16:31
【问题描述】:

不幸的是,我真的无法理解正则表达式,所以我最后的手段是向你们这些优秀的人寻求帮助。

我有这个现有的代码:

<li id="id-21" class="listClass" data-author="newbie">
    <div class="someDiv">
        <span class="spanClass">Some content</span>
    </div>

    <div class="controls faint">
        <a href="link2">Link 2</a>
        <a href="link3">Link 3</a>
    </div>
</li>

由于多种原因,我不得不使用 preg_replace 注入一段额外的代码:

<a href="link1">Link 1</a>

我想你可以猜到应该去哪里,但为了清楚起见,我希望得到的字符串看起来像:

<li id="id-21" class="listClass" data-author="newbie">
    <div class="someDiv">
        <span class="spanClass">Some content</span>
    </div>

    <div class="controls faint">
        <a href="link1">Link 1</a>
        <a href="link2">Link 2</a>
        <a href="link3">Link 3</a>
    </div>
</li>

谁能帮助我使用适当的正则表达式来实现这一点?

【问题讨论】:

  • 你最好更精确。你的意思是你只想在&lt;a href="link2"&gt;Link 2&lt;/a&gt;前面插入&lt;a href="link1"&gt;Link 1&lt;/a&gt;???
  • 不要使用正则表达式来解析/操作 HTML。获取合适的 HTML 解析器。
  • @Alvin Wong True,正则表达式无法解析任意 HTML。期间。
  • @luiges90 是的,这就是我想做的。
  • 我正在处理 HTML 模板,这些模板稍后会在我使用的软件中编译和解析。不要太拘泥于 HTML 方面的事情。如果我的示例不是 HTML 并且只是一个任意字符串,我将如何使用正则表达式来实现这一点?

标签: php regex preg-replace


【解决方案1】:

试试这个

$html = '<li id="id-21" class="listClass" data-author="newbie">
    <div class="someDiv">
        <span class="spanClass">Some content</span>
    </div>

    <div class="controls faint">
        <a href="link2">Link 2</a> 
        <a href="link3">Link 3</a>
    </div>
</li>';


$eleName = 'a';
$eleAttr = 'href';
$eleAttrValue = 'link2';
$addBefore = '<a href="link1">Link 1</a>';

$result = regexAddBefore($html, $eleName, $eleAttr, $eleAttrValue, $addBefore);

var_dump($result);

function regexAddBefore($subject, $eleName, $eleAttr, $eleAttrValue, $addBefore){
    $regex = "/(<\s*".$eleName."[^>]*".$eleAttr."\s*=\s*(\"|\')?\s*".$eleAttrValue."\s*(\"|\')?[^>]*>)/s";
    $replace = $addBefore."\r\n$1";

    $subject = preg_replace($regex, $replace, $subject);

    return $subject;
}

【讨论】:

    【解决方案2】:

    我可以建议两件事(虽然我不能清楚地理解你的问题)

    $newStr = preg_replace ('/<[^>]*>/', ' ', $htmlText); 
    

    这将从字符串中删除所有 html 标记。不知道对你有没有用。

    另一个建议是使用strip_tags 函数。 strip_tags 的第二个参数是可选的。您可以在第二个参数的帮助下定义要保留的标签。

    $str = '<li id="id-21" class="listClass" data-author="newbie">
            <div class="someDiv">
                <span class="spanClass">Some content</span>
            </div>
    
            <div class="controls faint">
                <a href="link2">Link 2</a>
                <a href="link3">Link 3</a>
            </div>
            </li>';
    
    echo strip_tags ($str,'<a>');
    

    这将为您提供仅包含链接和 html 字符串中的任何文本的输出。

    对不起,如果这也没有帮助。

    【讨论】:

    • 不幸的是,我正在使用的软件不是这样工作的。您的解决方案在正常情况下肯定可以工作,但基本上我正在努力创建一个插件,手动模板编辑不可行。大部分代码是我可以从数据库中提取的原始模板代码,我唯一的选择是制定一些正则表达式来将 Link 1 代码注入其中。该软件稍后会解析它并执行它需要做的任何事情来使 HTML 工作。我只需要在那里获取该链接。非常感谢您抽出宝贵时间回复。
    • 好的,然后看看新的答案。那是你正在寻找的吗?我试图理解这个问题,但可能是我不擅长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多