Как я могу заменить строку? - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть строка (эта строка поступает из базы данных, т.е. динамическая строка), которая содержит два тега <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> тег onclick="test2()" и т. Д., Используя PHP preg_replace или другой метод.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011
$str = str_replace(' href="',' onclick="test(this)" href="',$str);

Это значительно быстрее, чем preg_replace, поскольку он не должен соответствовать шаблону. Это, конечно, зависит от того, как вы его используете.

1 голос
/ 14 апреля 2011

Я не использовал эту библиотеку, но с помощью 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();

YouВероятно, придется немного его протестировать и изменить, чтобы он мог перейти в ваш процесс.

РЕДАКТИРОВАТЬ: Чтобы адаптировать это решение для использования ненавязчивого JavaScript, вы можете заменить $links[$i]->onclick на $links[$i]->id, а затем добавьте eventHandler с помощью javascript:

//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.function совпадает с window['function'], это делает преобразование превосходным.

Как и в случае с PHP-кодом, это может быть объектом для изменения в зависимости от вашей среды.Например, если все якоря, которым нужен onchange eventHandler, находятся под тегом div с идентификатором "mylinks", вы можете изменить document.getElementsByTagName("a"); на document.getElementById("mylinks).getElementsByTagName("a");.

1 голос
/ 14 апреля 2011

ПРИМЕЧАНИЕ : Это решение будет работать только с вашим текущим строковым шаблоном (который представляет собой набор ссылок)

ПРИМЕЧАНИЕ 2 : Вы также можете использовать ненавязчивый JavaScript для этого

Чтобы наконец ответить на ваш вопрос

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

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

EDIT

@ Элдрос указал, что методы должны быть разными для каждой ссылки.

Я бы определенно предложил вам позаботиться об этом на стороне клиента. Но если вы должны сделать это с 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 и перебрали ее, изменяя вашу ссылку одну за другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...