Регулярное выражение Javascript сопоставляет текст между тегами

#javascript #regex #match

#javascript #регулярное выражение #совпадение

Вопрос:

Мне нужно сопоставить с регулярным выражением javascript строку: bimbo999 из этого тега a: <a href="/game.php?village=828amp;amp;screen=info_playeramp;amp;id=29956" >bimbo999</a>

Числа из переменных URL (village и id) меняются каждый раз, поэтому я должен как-то сопоставлять числа с регулярным выражением.

 </tr>
                    <tr><td>Sent</td><td >Oct 22, 2011  17:00:31</td></tr>
                                <tr>
                        <td colspan="2" valign="top" height="160" style="border: solid 1px black; padding: 4px;">
                            <table width="100%">
    <tr><th width="60">Supported player:</th><th>
    <a href="/game.php?village=828amp;amp;screen=info_playeramp;amp;id=29956" >bimbo999</a></th></tr>
    <tr><td>Village:</td><td><a href="/game.php?village=828amp;amp;screen=info_villageamp;amp;id=848" >bimbo999s village (515|520) K55</a></td></tr>
    <tr><td>Origin of the troops:</td><td><a href="/game.php?village=828amp;amp;screen=info_villageamp;amp;id=828" >KaLa I (514|520) K55</a></td></tr>
    </table><br />

    <h4>Units:</h4>
    <table class="vis">
  

Я пытался с этим:

 var match = h.match(/Supported player:</th>(.*)</a></th></i);
  

но не работает. Ребята, вы можете мне помочь?

Комментарии:

1. Почему вы манипулируете HTML напрямую? Гораздо безопаснее (и обычно проще) работать через DOM. Найдите правильные <table> , затем соответствующие <a> теги в таблице, используя jQuery или библиотеку кросс-браузерного селектора, такую как Sizzle, а затем просто получите innerHTML <a> тега, чтобы получить bimbo999.

2. Использование регулярных выражений для обхода тегов html не очень хорошая практика. Вы пробовали создать элемент DOM из тега и получить innerHTML ?

Ответ №1:

Попробуйте это:

 /<a[^>]*>([sS]*?)</a>/
  
  • <a[^>]*> соответствует открывающему a тегу
  • ([sS]*?) сопоставляет любые символы перед закрывающим тегом, как можно меньше
  • </a> соответствует закрывающему тегу

([sS]*?) Фиксирует текст между тегами в качестве аргумента 1 в массиве, возвращаемом из exec match вызова or .

Это действительно хорошо только для поиска текста внутри a элементов, это не очень безопасно или надежно, но если у вас большая страница ссылок, и вам просто нужен их текст, это подойдет.


Гораздо более безопасным способом сделать это без регулярного выражения было бы:

 function getAnchorTexts(htmlStr) {
    var div,
        anchors,
        i,
        texts;
    div = document.createElement('div');
    div.innerHTML = htmlStr;
    anchors = div.getElementsByTagName('a');
    texts = [];
    for (i = 0; i < anchors.length; i  = 1) {
        texts.push(anchors[i].text);
    }
    return texts;
}
  

Комментарии:

1. /<a[^>]*>((?:.|r?n)*?)</a>/ также удобно для сопоставления со следующим закрывающим тегом по нескольким строкам.

2. Он будет соответствовать уже нескольким строкам s match any white space character [rntf ]

Ответ №2:

У меня нет опыта работы с регулярными выражениями, но я думаю, что вы можете использовать jQuery с .text() !

jQuery API — .text()

Я имею в виду, если вы используете :

 var hrefText = $("a").text(); 
  

Вы получите свой текст без использования регулярных выражений!

.find("a") а затем выдает вам список объектов тегов a, а затем использует .each() цикл для этого списка, после чего вы можете получить текст с помощью .text() .

Или вы можете использовать селектор класса, идентификатор или что угодно!

Комментарии:

1. это также можно сделать с помощью обычного javascript getElementsByTagName('a') . Неплохая идея.

2. В качестве примечания, не стоит использовать регулярное выражение для синтаксического анализа HTML 🙂