Регулярное выражение Javascript, которое игнорирует подстроку - PullRequest
1 голос
/ 26 июня 2010

Справочная информация:

Я нашел похожие SO сообщения на эту тему, но мне не удалось заставить его работать в моем сценарии.Заранее извиняюсь, если это обман.

Мое намерение:

Взять каждое английское слово в строке и преобразовать его в гиперссылку html.Эта логика должна игнорировать только следующую разметку: <br/>, <b>, </b>

Вот что у меня есть до сих пор.Он преобразует английские слова в гиперссылки, как я ожидал, но не имеет логики игнорирования тегов html (вот где мне нужна ваша помощь):

text = text.replace(/\b([A-Z\-a-z]+)\b/g, "<a href=\"?q=$1\">$1</a>");

Пример ввода / вывода:

Пример ввода:

this <b>is</b> a test

Ожидаемый результат:

<a href="?q=this">this</a> <b><a href="?q=is">is</a></b> <a href="?q=a">a</a> <a href="?q=test">test</a>

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 июня 2010

Вот гибридное решение, которое дает вам прирост производительности innerHTML и роскошь того, что вам не придется возиться со строками HTML при поиске совпадений:

function findMatchAndReplace(node, regex, replacement) {

    var parent,
        temp = document.createElement('div'),
        next;

    if (node.nodeType === 3) {

        parent = node.parentNode;

        temp.innerHTML = node.data.replace(regex, replacement);

        while (temp.firstChild)
            parent.insertBefore(temp.firstChild, node);

        parent.removeChild(node);

    } else if (node.nodeType === 1) {

        if (node = node.firstChild) do {
            next = node.nextSibling;
            findMatchAndReplace(node, regex, replacement);
        } while (node = next);

    }

}

Введите:

<div id="foo">
    this <b>is</b> a test
</div>

Процесс:

findMatchAndReplace(
    document.getElementById('foo'),
    /\b\w+\b/g,
    '<a href="?q=$&">$&</a>'
);

Вывод ( пробел добавлен для ясности ):

<div id="foo">
    <a href="?q=this">this</a>
    <b><a href="?q=is">is</a></b>
    <a href="?q=a">a</a>
    <a href="?q=test">test</a>
</div>
0 голосов
/ 26 июня 2010

Вот еще один метод JavaScript.

var StrWith_WELL_FORMED_TAGS    = "This <b>is</b> a test, <br> Mr. O'Leary! <!-- What about comments? -->";
var SplitAtTags                 = StrWith_WELL_FORMED_TAGS.split (/[<>]/);
var ArrayLen                    = SplitAtTags.length;
var OutputStr                   = '';

var bStartWithTag               = StrWith_WELL_FORMED_TAGS.charAt (0) == "<";

for (var J=0;  J < ArrayLen;  J++)
{
    var bWeAreInsideTag         = (J % 2) ^ bStartWithTag;

    if (bWeAreInsideTag)
    {
        OutputStr              += '<' + SplitAtTags[J] + '>';
    }
    else
    {
        OutputStr              += SplitAtTags[J].replace (/([a-z']+)/gi, '<a href="?q=$1">$1</a>');
    }
}

//-- Replace "console.log" with "alert" if not using Firebug.
console.log (OutputStr);
0 голосов
/ 26 июня 2010

Проблемы с регулярным выражением HTML в стороне, я бы сделал это в два этапа:

  • Прежде всего, так или иначе, извлеките тексты вне тегов
  • Тогда только сделайте это преобразование для этих текстов и оставьте все остальное нетронутым

Похожие вопросы

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