str_replace не работает в некоторых случаях

#php #str-replace

#php #str-replace

Вопрос:

Я использую curl для получения html и сохранения его в $content. Затем я пробую str_replace, это не работает:

echo str_replace('<a onclick="get_content('http://en.wikipedia.org');" style="cursor: defau<">Dojo</a> Applications','OK',$content);

Но когда я пытаюсь напечатать $ content и скопировать исходный код и снова сохранить его в $ content, это работает:

echo $content; Затем я копирую распечатанное и снова сохраняю его в $ content:

$content='It is <a onclick="get_content('http://en.wikipedia.org');" style="cursor: defau<">Dojo</a> Applications';

С новым $content вышеуказанная замена работает.

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

1. У меня это работает — PHP 5.3.2-1ubuntu4.5

2. это работает .. codepad.org/6SLzSaLW

3. Повторная публикация вопроса не изменит того факта, что вы не продемонстрировали, как воспроизвести проблему. Если мы не сможем воспроизвести это, мы не сможем это исправить.

Ответ №1:

Попробуйте также вставить ‘»‘. Я думаю, что дело в этом. Я не думаю, что в теге «style» нет ничего, что имело бы значение.

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

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

Ответ №2:

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

 str_replace('<a onclick="get_content('http://en.wikipedia.org');" ','OK',$content);
str_replace('" style="cursor: defau<">Dojo</a> Applications','OK',$content);
  

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

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

1. И тогда вы можете использовать манипуляции с DOM вместо хакерской замены неработающей строки.

Ответ №3:

Это работает для меня:

 <?php
$content='it is <a onclick="get_content('http://en.wikipedia.org');" style="cursor: defau<">Dojo</a> Applications';
echo str_replace('<a onclick="get_content('http://en.wikipedia.org');" style="cursor: defau<">Dojo</a> Applications','OK',$content); 
  

Таким образом, у вас, вероятно, есть фактические переводы строк внутри строк, и они не закодированы в одном формате, например, один — n (Linux), а другой — rn (Windows). Вы можете нормализовать обе строки перед сравнением:

 <?php
$content = strtr($content, array(
    "rn" => PHP_EOL,
    "r" => PHP_EOL,
    "n" => PHP_EOL,
));
  

В любом случае PHP обладает отличными функциями для обработки HTML. Я бы не рекомендовал регулярные выражения для этой задачи: они ненадежны, и их очень трудно получить почти правильно.

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

1. Пожалуйста, прочитайте мой обновленный вопрос. Я сомневаюсь, что $ content, который я получил с помощью curl, отличается от того, что я вижу с echo $ content.

2. @user570494: Вы «видите» это с помощью «View Source» или из HTML-вывода вашего браузера? Возможно, вы не сможете правильно проанализировать пробелы из выходных данных HTML.

3. @user570494 — Когда вы печатаете содержимое, как вы видите точные символы окончания строки, содержащиеся в тексте? Ваш обновленный вопрос предполагает, что проблема именно в том, о чем я догадался.