Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Преобразовать ссылку
 
 автор: блогер   (16.01.2011 в 02:08)   письмо автору
 
 

Строчке <a href="javascript:OpenDoc('2748-17');"> хочу придать вид
<a href="http://site.name.xx/cgi-bin/laws/main.cgi?nreg=2748-17&new=1">
Значение "2748-17" всегда варьируется, сохраняя при этом свою длину. Выражение надо написать одной строчкой. Если это представляется возможным - сделай.

  Ответить  
 
 автор: SHAman   (16.01.2011 в 15:08)   письмо автору
 
   для: блогер   (16.01.2011 в 02:08)
 

$text =~ s/<a\s+href="javascript:OpenDoc\('(\d\d\d\d-\d\d)'\);">/<a href="http:\/\/site.name.xx\/cgi-bin\/laws\/main.cgi?nreg=$1&new=1">/gi;


Можно более гибко, если есть вариации.

  Ответить  
 
 автор: Trianon   (16.01.2011 в 15:50)   письмо автору
 
   для: SHAman   (16.01.2011 в 15:08)
 

>Можно более гибко, если есть вариации.

просится либо так
$text =~ s/<a\s+href="javascript:OpenDoc\('([^']*)'\);">/<a href="http:\/\/site.name.xx\/cgi-bin\/laws\/main.cgi?nreg=$1&new=1">/gi;

либо, если следовать строго букве условия, так
$text =~ s/<a\s+href="javascript:OpenDoc\('([^']{7})'\);">/<a href="http:\/\/site.name.xx\/cgi-bin\/laws\/main.cgi?nreg=$1&new=1">/gi;

Правда, боюсь что простой подстановки будет недостаточно.

  Ответить  
 
 автор: SHAman   (16.01.2011 в 17:07)   письмо автору
 
   для: Trianon   (16.01.2011 в 15:50)
 

Твои ничем не отличаются почти. Но мое решение, вероятно, быстрее, так как интерпретатору регулярных выражений точно известно что именно искать, не используется шаблон неопределенной длинны и точнее классы символов. \d - меньшее множество, чем [^'].

  Ответить  
 
 автор: блогер   (17.01.2011 в 08:22)   письмо автору
 
   для: SHAman   (16.01.2011 в 15:08)
 

Проверить бы. У перла какой аналог print или echo или say? Имя переменной - text или $text?

  Ответить  
 
 автор: SHAman   (17.01.2011 в 09:55)   письмо автору
 
   для: блогер   (17.01.2011 в 08:22)
 

#!/usr/bin/perl

#эту строчку нужно раскоменнтировать если скрипт запускается через браузер, а не через консоль
#print "Content-type: text/html\n\n";

$text=qq(<a href="javascript:OpenDoc('(1432-17)');">);
print "<p>Было: $text</p>";
$text =~ s/<a\s+href="javascript:OpenDoc\('(\d\d\d\d-\d\d)'\);">/<a href="http:\/\/site.name.xx\/cgi-bin\/laws\/main.cgi?nreg=$1&new=1">/gi;

print "<p>Стало: $text</p>";

  Ответить  
 
 автор: блогер   (17.01.2011 в 23:34)   письмо автору
 
   для: SHAman   (17.01.2011 в 09:55)
 

В консоли запускал. Что-то не так.
<p>Стало: <a href="javascript:OpenDoc('(1432-17)');"></p>

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

  Ответить  
 
 автор: SHAman   (18.01.2011 в 09:55)   письмо автору
 
   для: блогер   (17.01.2011 в 23:34)
 

Ну конечно не получается. Скобки лишние надо убрать:)
OpenDoc('(1432-17)')
заменить на 
OpenDoc('1432-17')


Это я тупанул когда переписывал исходные данные по регулярке.

Если убить первую переменную, то где будет храниться изначальный текст-то? Второе выражение - это не присваивание а операция связывания.

$text =~ s/мама/папа/;
найдет в тексте, содержащемся в переменной $text все строки "мама" и заменит их на "папа".

$text =~ /мама/;
Вернет истину если в тексте, содержащемся в переменной $text есть подстрока "мама" и ложь в противном случае.

  Ответить  
 
 автор: блогер   (18.01.2011 в 10:40)   письмо автору
 
   для: SHAman   (18.01.2011 в 09:55)
 

Вот теперь работает. В консоли. А для того, что бы оно работало там, где я задумал - выражение должно быть написано в одну строчку. Там нет возможности определять переменные, да и не подгонишь один конкретный пример под все случаи - ID варьируется. Короче, надо s/было/стало/

  Ответить  
 
 автор: SHAman   (18.01.2011 в 10:56)   письмо автору
 
   для: блогер   (18.01.2011 в 10:40)
 

facepalm.jpg

Я уже дал решение в одну строку. Я не знаю где вы задумали и что и как и не знаю что вы ожидаете от работы скрипта. Как вы задачу поставили, так я ее и решил. Причем несколько раз, заметим. Если вы хотите решать другую задачу, то надо было ставить ее как есть. Если вам достаточно принципа, то вот он принцип - берите и используйте.

Я точно знаю что одной операцией можно заменить все ссылки описанного вами вида на то, что должно получиться. И я могу сделать это. И я показал как. Чего вам еще надо-то?

  Ответить  
 
 автор: блогер   (19.01.2011 в 01:51)   письмо автору
 
   для: SHAman   (18.01.2011 в 10:56)
 

Какое-то из решений оказалось рабочим - я задействовал все. В результате желаемая цель была достигнута. Ты оказал мне неоценимую услугу.
Если, что надо написать на REXX - обращайся 626C6F676572406E67732E7275

  Ответить  
 
 автор: Trianon   (18.01.2011 в 11:13)   письмо автору
 
   для: блогер   (18.01.2011 в 10:40)
 

шаблон с произвольным id я привел в (16.01.2011 в 15:50) в первой из строк.

  Ответить  
 
 автор: SHAman   (18.01.2011 в 09:58)   письмо автору
 
   для: блогер   (17.01.2011 в 23:34)
 

Вот результат работы скрипта.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования