Сравнение строк (возможно, проблема со скрытыми символами?) - PullRequest
2 голосов
/ 18 января 2010

Я пытаюсь сделать что-то необычное с блогом блоггера, и когда я просматриваю тот или иной блог, я бы хотел узнать, какой он есть.

Итак, хотя, возможно, есть лучший способ сделать это, я настроил этот бит кода:

//Get title of current blog
currentTitle = document.getElementById("post-title").innerText;
currentTitle = currentTitle.replace(/<\/?[^>]+(>|$)/g, "");
currentTitle = currentTitle.replace("/n","");
currentTitle = currentTitle.replace("/r","");
//Run through titles until you find a match
for (count = 0; count <= titles.length; count++)
{
  //alert(currentTitle);
  //alert(titles[count]);
  if (titles[count] != null)
  {
    checkTitle = titles[count];
checkTitle = checkTitle.replace(/<\/?[^>]+(>|$)/g, "");
    checkTitle = checkTitle.replace("/n","");
    checkTitle = checkTitle.replace("/r","");
alert(checkTitle.toString()+" + "+currentTitle.toString());
    if (checkTitle.toString() == currentTitle.toString())
    {
      alert(count);
    }
  }
}

Где title [] - это массив заголовков, прочитанных из RSS-канала (идея заключается в том, что, если я получу индекс для заголовка, я могу применить его к другому массиву, который я прочитал из указанного канала).

Дело в том, что, хотя первое предупреждение создает две строки, которые выглядят одинаково, они не улавливаются оператором if ... Я добавил строки, чтобы установить две переменные в одну строку, и это подхватывает их. Единственное решение, о котором я могу даже подумать, это то, что мне не хватает скрытого персонажа или чего-то еще в одной из строк, но я думаю, что все они покрыты! У кого-нибудь есть идеи?

Ответы [ 4 ]

3 голосов
/ 18 января 2010

Попробуйте \n и \r. Вы также можете сделать .trim() для удаления лишних пробелов.

EDIT: Как отметил Джонас, в JavaScript нет встроенной функции .trim (), поэтому вы можете создать свою собственную, как эта ссылка описывает.

2 голосов
/ 18 января 2010

Почему вы пытаетесь удалить тегоподобные структуры (с регулярным выражением, которое для этого ненадежно; не надо) из заголовков, которые уже являются простым текстом? (Начиная с innerText; работает только в IE; другим браузерам вместо этого потребуется стандартное свойство textContent.) Заголовки RSS не являются двойным кодированием HTML-in-XML (хотя могут быть и длинные описания).

Как бы то ни было, вы пытаетесь удалить \n и \r, но у вас неправильные слэши. Также вполне возможно, что у вас все еще будут начальные и конечные пробелы или табуляции. Как сказал Шон, вам лучше обрезать все эти пробельные символы перед сравнением, например .:

// assuming each item in `titles` has already been trimmed too
var el= document.getElementById("post-title");
var title= 'textContent' in el? el.textContent : el.innerText;
var count= titles.indexOf(title.trim());

Тем не менее, этот хороший лаконичный код использует несколько методов ECMAScript Fifth Edition, которые пока недоступны во всех браузерах: map и indexOf в Array и trim в String. Однако вы можете добавить их на язык самостоятельно для браузеров, которые его не поддерживают:

// Add some ECMA262-5 methods if not already supported natively
//
if (!('indexOf' in Array.prototype)) {
    Array.prototype.indexOf= function(find, from) {
        for (var i= from || 0, n= this.length; i<n; i++)
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('map' in Array.prototype)) {
    Array.prototype.map= function(mapper, that) {
        var other= new Array(this.length);
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                other[i]= mapper.call(that, this[i], i, this);
        return other;
    };
}
if (!('trim' in String.prototype)) {
    String.prototype.trim= function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}
0 голосов
/ 18 января 2010

Пара подсказок по отладке: вместо новой косой черты в новой строке и при возврате каретки у вас есть косая черта. Они должны быть \ n & \ r. Когда вы предупреждаете, попробуйте поставить символ до и после каждого заголовка, чтобы вы могли видеть границы строки. Если это не показало пропавший символ, используйте цикл for и шагайте по каждой строке, чтобы увидеть все символы с помощью string.charAt (i). Для сравнения строк вы должны использовать === вместо ==.

0 голосов
/ 18 января 2010

Вы можете попробовать

alert(checkTitle.toString().length+" + "+currentTitle.toString().length);

и toUpperCase() и обрезка строки могут куда-то привести.


...