powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / regexp и жадность
3 сообщений из 3, страница 1 из 1
regexp и жадность
    #32806711
Sanych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TASK:

В файле есть тэги <lang>, внутри которых тэги <lang0>, <lang1>, <lang2>...
Задается lang по умолчанию, например, <lang1>.

Если <lang1> в <lang> нет, то по умолчанию берется <lang0>.
<lang0> всегда есть в <lang>.

В общем нужно эту всю фигню отпарсить.


INPUT:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
some text or null
       <lang>
         <lang0><i>Lang  99 </i></lang0>
         <lang2><b>Lang  33  </b></lang2>
       </lang>
some text or null
       <lang>
         <lang0><i>Lang asdfasdfd99</i></lang0>
         <lang1><b>Lang  100  </b></lang1>
       </lang>
some text or null
       <lang>
         <lang0>Lang  0  </lang0>
         <lang2>some html or null Lang  2  </lang2>
       </lang>
some text or null


CODE:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    $fcontents = implode ('', file ('input.txt'));
    $default =  1 ;

    $patterns = array(
        "|<lang>[^.]*?<lang$default>([^.]*)</lang$default>[^.]*?</lang>|si",
        "|<lang>[^.]*?<lang0>([^.]*)</lang0>[^.]*?</lang>|si"
    ); 

    $replace = array('$1', '$1');

    $fcontents = preg_replace ($patterns, $replace, $fcontents);
    print_r($fcontents);

RESULT:

Код: plaintext
1.
2.
3.
4.
5.
some text or null
       <b>Lang  100  </b>
some text or null
       Lang  0 
some text or null


MUST BE:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
some text or null
       <i>Lang  99 </i>
some text or null
       <b>Lang  100  </b>
some text or null
       Lang  0 
some text or null


HELP pls.

Всем спасибо заранее.
...
Рейтинг: 0 / 0
regexp и жадность
    #32806732
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Если бы вы всё так не расписали - я бы просто послал вас в ман по PCRE + читать статью Регулярные выражения, Часть I + Часть II . Но я сегодня добрый, и даже покажу новую функцию file_get_contents (что ни в коей мере не освобождает вас от прочтения материала по ссылкам) ;) и как можно решить вашу задачу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
$fcontents = file_get_contents('input.txt');
$default =  1 ;
echo preg_replace("#<lang>(.*)</lang>#Usei",'my_lang_func("$1",'.$default.')',$fcontents);

function my_lang_func($lang,$default){
  if (preg_match("#<lang{$default}>(.*)</lang{$default}>#Usi",$lang,$ret));
  else preg_match("#<lang0>(.*)</lang0>#Usi",$lang,$ret);
  return $ret[ 1 ];
}
За всеми остальными объяснениями - по ссылкам. Контроль ошибок прикручивайте сами :)
PS: функцию my_func, имхо, в целях повышения производительности может быть разумным переписать на строковых функциях, правда, придётся чуть покарячиться для реализации PCRE'шного аналога модификатора i ;)
...
Рейтинг: 0 / 0
regexp и жадность
    #32807023
Sanych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо тебе гость.
За ссылки в том числе.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / regexp и жадность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]