Как я могу удалить дополнительный тег </html> из строки, используя регулярное выражение? - PullRequest
0 голосов
/ 01 марта 2011

Я использую php DOMDocument, чтобы заменить узел, а затем переписать страницу. HTML-код, который записывается обратно, представляет собой простой текст (не HTML), поэтому мне пришлось преобразовать его следующим образом:

$content = files::readFile($data['page_path']);
$content = str_replace('&lt;', '<', $content);
$content = str_replace('&gt;', '>', $content);

if (!@fwrite($handle, $content))
{
    print 'Failed to replace entities';
    return FALSE;
}

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

В любом случае, я подумал об использовании:

$content = preg_replace('#\<\/head\>*(:alphanum:)#', '</html>', $content);

чтобы удалить его, но это не так, как я думал.

Помогите пожалуйста!

Пример тестирования:

$html = '
   <div id="footer">
       <div class="wrap">
           <strong class="logo"><a href="#">College</a></strong>
           <ul><li><a href="#">Emergencies</a></li>
               <li><a href="#">Contact</a></li>
               <li><a href="#">Copyright</a></li>
               <li><a href="#">Terms of Use</a></li>
               <li><a href="#">Member of The Colleges</a></li>
           </ul><p>© 2010 College</p>
       </div>
   </div>
</body></html>
li>
               <li><a href="#">Contact</a></li>
               <li><a href="#">Copyright</a></li>
               <li><a href="#">Terms of Use</a></li>
               <li><a href="#">Member of The Colleges</a></li>
           </ul><p>© 2010 College</p>
       </div>
   </div>
</body></html>';

preg_match("#</head>.*#si", $html, $matches);
var_dump($matches);

Ответы [ 3 ]

0 голосов
/ 01 марта 2011

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

$content = preg_replace('#</head>[\da-z]*#i', '</html>', $content);

ВНа самом деле, мне интересно, если вы захотите сопоставить все после тега </head>, в этом случае это может сработать для вас:

$content = preg_replace('#</head>.*#si', '</html>', $content);

Редактировать: Теперь, когда вы добавили пример текста, я вижуу вас есть 2 </html> тегов.Как насчет:

$content = preg_replace('#</html>.*#si', '</html>', $content); 
0 голосов
/ 05 марта 2011

Проблема, с которой я столкнулся, была решена: Я выяснил странную ошибку, с которой я столкнулся в контенте многократного использования! Я обнаружил проблему при использовании функции PHP fwrite () при использовании режима «r +». Если вы увидите документацию по этой функции на php.net/fopen, вы увидите, что r + делает следующее: Открыто для чтения и записи; поместите указатель файла в начале файла. Я наивно полагал, что это означает, что, так как указатель был в начале, он будет перезаписывать все содержимое файла. Нет, на самом деле это не правда. Если вы хотите, чтобы этот эффект, вы должны использовать режим "W", который выполняет следующие действия: Открыть только для записи; поместите указатель файла в начале файла и обрежьте файл до нулевой длины. Если файл не существует, попытайтесь создать его.

0 голосов
/ 01 марта 2011

Ваш код:

$content = preg_replace('#\<\/head\>*(:alphanum:)#', '</html>', $content);

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

Решение состоит в том, чтобы заменить :alphanum: на правильный синтаксис PREG.

В случае :alphanum: правильный синтаксис: [0-9a-zA-Z].

Существуют также сокращения, такие как \d для любого числового символа, который можно использовать вместо 0-9.См. http://www.regular -expressions.info / reference.html для получения дополнительной информации об этом.

[EDIT]

Итак, теперь у вас есть:

$content = preg_replace('#\<\/head\>*([0-9a-zA-Z])#', '</html>', $content);

Как вы говорите, это все еще не работает, но, по крайней мере, решается очевидная проблема.

Первый вопрос: у вас есть "" в регулярном выражении, но вы, кажется, спрашиваетезаменить все после "" - это "" опечатка?

Второй пункт: регулярное выражение [0-9a-zA-Z] будет соответствовать только одному символу.Чтобы сопоставить несколько символов, вам нужно добавить либо +, либо * после [0-9a-zA-Z].Знак «плюс» означает, что вы хотите сопоставить один или несколько из [0-9a-zA-Z], тогда как звездочка означает ноль или более вхождений.

Третий пункт: код, указанный в вопросе, содержит больше, чем просто буквенно-цифровые символы,Это HTML, поэтому он включает в себя угловые скобки, # -символы, даже символ авторского права.Очевидно, что [0-9a-zA-Z] не будет соответствовать ни одному из них (равно как и :alphanum: с использованием синтаксиса ereg).

Вы можете добавить все символы, которые могут появиться в коде, к вашему регулярному выражению, чтобы сделать что-то вроде [0-9a-zA-Z<>#] но это, вероятно, не практично.Лучшей идеей будет сопоставление любых символов, а не поиск буквенно-цифровых символов.Чтобы сопоставить любой символ, вы должны использовать точку (.), поэтому ваше регулярное выражение будет выглядеть примерно так:

$content = preg_replace('#</html>.+#', '</html>', $content);

Надеюсь, это поможет.

...