Регулярное выражение для установки параметра href тегов привязки - PullRequest
1 голос
/ 05 марта 2009

Я ищу способ найти и заменить большое количество текстовых файлов. Например;

Я хочу выбрать;

<li><a href="">Istanbul, TR POS </a></li>
<li><a href="">Ankara, TR POS </a></li>
<li><a href="">Izmir, TR POS </a></li>

С;

<li><a href="pos-istanbul-tr.php">Istanbul, TR POS </a></li>
<li><a href="pos-ankara-tr.php">Ankara, TR POS </a></li>
<li><a href="pos-izmir-tr.php">Izmir, TR POS </a></li> 

Обратите внимание, что начальная буква в нижнем регистре также добавляется как часть ссылки. Это должно быть сделано для большого количества текстовых файлов, поэтому я ищу наиболее эффективный способ с помощью регулярных выражений или любого программного обеспечения, которое, по вашему мнению, может помочь.

Ответы [ 7 ]

5 голосов
/ 05 марта 2009
$ perl -i.bak \
>  -pe's/href="">([^,]+)/\'href="pos-\'. (lc $1) . \'-tr.php">\'. $1/eg' \
>  *.html

Кроссплатформенный вариант (+ построение на @ ответ Джонатана Леффлера )

Сохранить как fill-href.pl:

#!/usr/bin/perl -w -pi.bak
s/href="">([^,]+)/href="pos-\L$1\E-tr.php">$1/g

Пробег:

perl fill-href.pl test1.html test2.html
1 голос
/ 05 марта 2009

Используя движок textmate regex, вам нужно:

найти:

([A-Za-z] +), TR POS

заменить:

$ 1, TR POS

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

1 голос
/ 05 марта 2009

Если у вас есть доступ к Perl-совместимому механизму регулярных выражений (PCRE), например PHP preg_replace(), или даже к Perl, если необходимо ;-), вы можете заменить это регулярное выражение:

<a href="">([^,]+),\s+(\w+)\s+(\w+)

с этим:

<a href="\L$3-$1-$2\E.php">$1, $2 $3

Модификаторы \L и \E делают нижний регистр для вас.

$i = '<li><a href="">Izmir, TR POS </a></li>';
$r = '/<a href="">([^,]+),\\s+(\\w+)\\s+(\\w+)/';
$s = '<a href="\\L$4-$2-$3\\E.php">$1, $2 $3';

$o = preg_replace($r, $s, $i);
echo $o;

VI / VIM имеют аналогичный механизм манипулирования регистром в обратных ссылках.

1 голос
/ 05 марта 2009
perl -pi.bak -e 's%<li><a href="">(\W+), TR POS </a></li>%<li><a href="pos-\L$1\E-tr.php">$1, TR POS </a></li>%g;' file1 file2 ...

Не проверено - возможно, слишком упрощено, но должно работать с образцами данных. '-p' заставляет Perl печатать каждую строку; -i.bak создает резервную копию файла с расширением .bak и перезаписывает оригинал.

0 голосов
/ 05 марта 2009

Используйте некоторый текстовый редактор, способный к регулярному выражению и "поиску в файлах". Например. EditPlus

затем заменить

<li><a href="">([A-Za-z]+), TR POS <\/a><\/li>

с

<li><a href="pos-\1-tr.php">\1, TR POS </a></li>

(Возможно, нужно еще немного убежать, то есть обратные слеши ...)

0 голосов
/ 05 марта 2009

Если вы работаете в Linux, вам может пригодиться эта тема:

Для этого вы можете использовать инструмент командной строки, такой как sed, язык сценариев, такой как Python / Perl, или любое другое решение. Если вы сможете дать более подробную информацию о том, что вы ищете, и о том, на какой операционной системе он должен работать, это поможет дать более конкретный ответ.

0 голосов
/ 05 марта 2009

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

Звучит очень выполнимо с awk , если вы находитесь на платформе, которая его имеет. Или вы можете набросать что-нибудь на Python, Perl или что-то другое. Скорее всего, будут другие ответы с реальным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...