Xpoint
   [напомнить пароль]

Как удалить некириллические символы внутри тэга b

Метки: [без меток]
2010-10-28 15:27:09 [обр] Даниил Иванов(0/63)[досье]

Задача удаления некириллических символов из строки проста - это делается так
$s = preg_replace ("![A-Za-z]!s","","Мама мыла white раму");

Столкнулся с задачей удаления некириллических символов внутри тэга <b>..</b>. А чтобы всё что вне этого тэга,то, соответственно, не удалялось бы. Сам тэг, состоя из некириллических символов, тоже удалятся не должен, естественно :)
Тоже вроде бы простая задача, но что-то никак не получается. Подскажите, пожалуйста, соответствующий регэксп.

спустя 5 минут [обр] Даниил Иванов(0/63)[досье]
Вообще, конечно, шаблон ![A-Za-z]!s не удалит символы с умляутами, поэтому со строго формальной точки зрения, он удаляет не все некириллические символы, но на суть задачи это не влияет.)
спустя 5 часов [обр] Алексей Севрюков(162/1280)[досье]
Даниил Иванов[досье] Тут нужен вложенный регул или вызов процедуры при замене. Первый регул ищет контент блоков <b>..</b> и заменяет его на результат вызова пользовательской функции которая удаляет все нелатинские символы.
спустя 1 минуту [обр] Алексей Севрюков(162/1280)[досье]
сообщение промодерировано
Вот эта функция: preg_replace_callback
спустя 2 дня 23 часа [обр] Даниил Иванов(0/63)[досье]

Алексей Севрюков[досье] Спасибо.

Решение будет вот таким (в множество [A-Za-z] надо добавить ещё символы с умляутами):

<?php

header('Content-type: text/html;charset=utf-8');
$str ='<h1>Мама мыла white  раму</h1> раз  два три <h1>Эники беники ели variniki</h1>';
$line = preg_replace_callback(
        '|<h1>(.*?)</h1>|',
        create_function(
            '$matches',
            'return "<h1>".preg_replace ("![A-Za-z]!su","",$matches[1])."</h1>";'
        ),
        $str
    );
    echo $line;
?>
спустя 15 часов [обр] Алексей Севрюков(162/1280)[досье]

Все верно, только:

  1. create_function лучше бы вынести за пределы цикла ( в данном случае preg_replace_callback это цикл).
  2. ![A-Za-z]+!su по идее должно работать быстрее.
  3. После удаления латинского слова могут появится двойные пробелы. пустые строки. Их тоже хорошо бы "убить". И это далеко не все варианты возможных проблем.

ИМХО.

Powered by POEM™ Engine Copyright © 2002-2005