我该如何更换字符串?

时间:2011-04-14 07:50:18

标签: php javascript-events

我有一个字符串(此字符串来自数据库,即动态字符串),其中包含两个<a>标记。 E.g:

$str = '<a href="http://www.google.com" key1="value1">Any string</a>
       <a key1="value1" href="http://www.google.com">Any string</a>';

如何为该字符串中的onclick标记添加单独的<a>属性,即第一个<a>代码onclick="test1()",下一个<a>代码{ {1}}等,使用PHP onclick="test2()"或其他方法。

3 个答案:

答案 0 :(得分:2)

$str = str_replace(' href="',' onclick="test(this)" href="',$str);

这比preg_replace快得多,因为它不必匹配模式。 当然,这取决于您使用它的方式。

答案 1 :(得分:1)

注意此解决方案仅适用于您当前的字符串模式(似乎是链接集合)

注意2 :您也可以使用unobtrusive javascript进行此操作

最后回答你的问题

$str =  str_ireplace ('<a ', '<a onclick="doSomething(this)"', $str);

http://php.net/manual/en/function.str-ireplace.php

修改

@Eldros指出,每个链接的方法都需要不同。

因为我肯定建议你在客户端照顾它。但是,如果您必须使用PHP执行此操作,则可以使用类似Simple HTML DOM的库进行DOM解析。 请注意,使用DOM操作,而是使用字符串解析。这可能对您有用,也可能无关紧要。

这是显示如何修改字符串的文档中的示例。有关完整用法的信息,请参阅文档:http://simplehtmldom.sourceforge.net/manual.htm

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');
$html->find('div', 1)->class = 'bar';
$html->find('div[id=hello]', 0)->innertext = 'foo';
echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

在您的情况下,您只需使用str_get_html加载字符串并循环修改您的链接。

答案 2 :(得分:1)

我没有使用此库,但在PHP Simple HTML DOM Parser的帮助下,您可以使用此代码尝试添加函数:

//array containing your functions names
$functions = array(test1, test2);

//Parse the string to get the HTML DOM
$html = str_get_html($str);

//Retrieve the array of anchors
$links = $html->find('a');

//Loop through the anchors and add the onclick events
for($i=0;$i<count($links);$i++){
    $links[$i]->onclick = $functions[$i];
}

//return the html to the string
$html->save();

您可能需要对其进行一些测试并进行更改,以便将其传递到您的过程中。

编辑:要调整此解决方案以便使用不引人注目的JavaScript,您可以将$links[$i]->onclick替换为$links[$i]->id,然后使用javascript添加eventHandler:

//Add an event listener that will trigger when the content of the page is loaded
document.addEventListener("DOMContentLoaded", function() {
    var i;

    //retrieve all the anchors
    var link = document.getElementsByTagName("a");
    //Loop through the anchors
    for(i=0; i<links.length; i++){
        //If the anchor has an id
        if(links[i].id){
            //retrieve the function
            var myFuncName = links[i].id;
            var myFunction = window[myFuncName];
            //add the event listener
            links[i].addEventListener("change", myFunction, false);
        }
    }
}, false);

检索函数非常重要,因为links[i].id是一个字符串,而addEeventListener不会使用字符串而不是函数。由于window.functionwindow['function']相同,因此可完美转换。

与PHP代码一样,这可能是根据您的环境而改变的对象。例如,如果需要onchange eventHandler的所有锚定位于ID为“mylinks”的div标记下,则可以document.getElementsByTagName("a");更改document.getElementById("mylinks).getElementsByTagName("a");