Забыли пароль?
Запросите новый здесь.

Автор темы: Zaxap
ID темы: 2163
Информация:
Тема содержит 20 сообщения, была просмотрена 9151 раз.
Просмотр темы
PHP-Fusion Russia » Веб-разработка » PHP
 Распечатать тему
Несколько вопросов по preg_replace
Zaxap
Имеется просто php-страница, не относящаяся к движку.
Тема, впрочем, заезженная: необходимо из http(s)://my.site сделать <a href="http(s)://my.site" target="_blank">http(s)://my.site</a> - сделать ссылку кликабельной.

Вот это кусок кода из "!autolink_bbcode_include.php":
Загрузить источник  GeSHi: PHP
  1. $text = preg_replace('#(^|[\n ])((http|https|ftp|ftps)://[\w\#$%&~/.\-;:=,?@\[\]\(\)+]*)#sie', "'\\1<a href=\''.trim('\\2').'\' target=\'_blank\' title=\'autolink\'>'.trimlink('\\2', 20).(strlen('\\2')>30?substr('\\2', strlen('\\2')-10, strlen('\\2')):'').' </a>'", $text);
Добавлено за 0.022 секунд, используя GeSHi 1.0.8.10

но оно не работает (явно благодаря trim и trimlink...

Нашел кусок кода в интернете:
Загрузить источник  GeSHi: PHP
  1. $text=preg_replace('#((?:http|https):\/\/[^\s]+)#i','<a href="$1" />$1', $text);
Добавлено за 0.021 секунд, используя GeSHi 1.0.8.10

который заработал... но, не только по полученному результату, но и по самому коду (<a href="$1" />$1) видно, что тут как-то все не так...
В результате оборачивается в <a></a> также весь текст после ссылок.

---

Сколько раз убеждаюсь, что думать эффективнее письменно или вслух...

Загрузить источник  GeSHi: PHP
  1. $text=preg_replace('#((http|https|ftp|ftps)://[\w\#$%&~/.\-;:=,?@\[\]\(\)+]*)#i','<a href="$1">$1</a>', $text);
Добавлено за 0.018 секунд, используя GeSHi 1.0.8.10


Исправляйте, если что не так :)






Необходимо из
[idXXXXXX|Человек]
получить
<a href="idXXXXXX">Человек</a>
по типу <a href="$1">$2</a>...
Но как производить выборку в уже квадратных скобках...((
---
Попробовал сделать нечто такое:
Загрузить источник  GeSHi: PHP
  1. $text = preg_replace('#[id[0-9]|[A-Za-z0-9]]#i', '<a href="vk.com/id$1">$2</a>', $text);
Добавлено за 0.019 секунд, используя GeSHi 1.0.8.10

Но вот, увы...
Изменил(а) Zaxap, 20.04.2014 09:47
Зло не дремлет, а я добрый...
 
Polarfox
Так?

Оффтопик У тебя есть проблемы с гуглем, мб нужно что-то пояснить?

Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме
 
Zaxap
PolarFox, у меня есть проблемы с preg_replace.
Необходимо из
[idXXXXXX|Человек]
получить
<a href="idXXXXXX">Человек</a>
по типу <a href="$1">$2</a>...


Оффтопик поисковики несовершенны и ущербны

Зло не дремлет, а я добрый...
x1
 
Polarfox
Оффтопик Проигнорил? Ну ладно, твое дело.

Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме
 
Zaxap
PolarFox,
return preg_replace('!(http://[a-z0-9_./?=&-]+)!i', '<a href="$1">$1</a> ', $text." ");


Мне надо получить $1 $2, а свой первый вопрос с ссылкой, ответ на который вы мне скинули, я решил часов 6 назад.
Изменил(а) Zaxap, 20.04.2014 14:18
Зло не дремлет, а я добрый...
 
Pisatel
Честно, я никак не въеду до конца. Дай реальную ссылку, которую нужно найти. И реальный пример того, что должно получиться. Потому что не понимаю, что должно быть в $2
Изменил(а) Pisatel, 20.04.2014 16:41
 
Web
Zaxap
Pisatel, сделал так:

Загрузить источник  GeSHi: PHP
  1. $text = preg_replace('/[(*?)|(*?)]/', '<a href="vk.com/$1" target="_blank">$2</a>', $text);
Добавлено за 0.022 секунд, используя GeSHi 1.0.8.10


Тут такая проблема:
$text = preg_replace('/[(*?)|(*?)]/', '<a href="vk.com/$1" target="_blank">$2</a>', $text);

Вот эти квадратные скобки тоже возвращаются, а "кликабельность" игнорится попросту, в дополнение к этому сие применяется и к некоторым другим "элементам" текста...
Пытался сделать так:
Загрузить источник  GeSHi: PHP
  1. $text = preg_replace('/[[a-zA-Z0-9]|[a-zA-Z0-9]]/', '<a href="vk.com/$1" target="_blank">$2</a>', $text);
Добавлено за 0.021 секунд, используя GeSHi 1.0.8.10

но оно жутко косячит и не выполняет того, что от него требуется...
---
Насколько я понял, принцип у preg_replace примерно тот же, что и у функции mod_revew в .htaccess...
---
Необходимо из
[idXXXXXX|Человек]
получить
<a href="http://vk.com/idXXXXXX">Человек</a>
по типу <a href="http://vk.com/$1">$2</a>...

Выделенное синим - это $1, красным - $2...


Изменил(а) Zaxap, 20.04.2014 14:27
Зло не дремлет, а я добрый...
 
Pisatel
Первое, что увидел- экранируй символы, то есть \[ , \|, \], так как это тоже часть выражения []
Загрузить источник  GeSHi: PHP
  1. $text = preg_replace('/\[(.*?)\|(.*?)\]/i', '<a href="http://vk.com/$1" target="_blank">$2</a>', $text);
Добавлено за 0.023 секунд, используя GeSHi 1.0.8.10
x1
 
Web
Polarfox
Оффтопик Для отладки рекомендую JGSoft RegexBuddy (подсказка для россии - рутракер), все видно красиво удобно и понятно, и косяков со спецсимволами не будет.
Минусы: англ., платный

Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме
 
Zaxap
Pisatel, как-то... не знал, что надо экранизировать, думал, блин, как бороться с [ ] и |, ибо они воспринималось как-то...
Как переменные...
Зло не дремлет, а я добрый...
 
Pisatel
Если это текст [, ], | , который мы ищем- его надо экранировать. Так же, как точку, знак вопроса, слеш... Так что, не работает?
 
Web
Zaxap
Работает, очень даже :)
Спасибо!

---

Решил не создавать новую тему...
Есть
Загрузить источник  GeSHi: PHP
  1. $text='<p>hello<br />
  2. world<br />
  3. </p>';
Добавлено за 0.022 секунд, используя GeSHi 1.0.8.10

хочу заменить его на
Загрузить источник  GeSHi: PHP
  1. '<p>hello</p>
  2. <p>world</p>'
Добавлено за 0.021 секунд, используя GeSHi 1.0.8.10


Делаю так:
Загрузить источник  GeSHi: PHP
  1. $text=preg_replace("#<br \/>\n#si","</p>\n<p>",$text);
  2. $text=preg_replace("#<p>\n</p>#si","",$text);
Добавлено за 0.023 секунд, используя GeSHi 1.0.8.10


Но ничего...
Изменил(а) Zaxap, 01.06.2014 08:44
Зло не дремлет, а я добрый...
 
spiker
Обязательное условие для головоломки preg_replace?
А на массив нельзя текст разбить, не?
Типа
Скачать исходники  Код
<?

    $text = '<p>hello<br />
             world<br />
             </p>';

    function _abc ($text) {
      $text = preg_replace("!<p>(.*?)</p>!si", "\\1", $text);      
      $array = explode('<br />', $text);      
      $text = '';
       foreach($array  as  $value) {
          $value = trim($value);
           if ($value) $text .= '<p>'.$value.'</p>'."\n";
               }             
       return $text;   
         }

   
   
   echo _abc ($text);


?>


 
Zaxap
spiker, зачем массив? Зачем foreach() О.о
Это уже как...психокинезом заставлять двигаться собственные руки, что ли...
$text - не космическая станция, а простой текст с <br /> в конце каждой строки...

Вот так работает (ну это ясно):
Загрузить источник  GeSHi: PHP
  1. $text=preg_replace("@<br \/>@si","</p><p>",$text);
  2. $text=preg_replace("@<p></p>@si","",$text);
Добавлено за 0.023 секунд, используя GeSHi 1.0.8.10


Мне просто нужно в одних местах выбрать перенос строки \n и в другие вставить (пытался врубиться в примеры на php.net, делал по аналогии - глухо)...
Изменил(а) Zaxap, 01.06.2014 14:00
Зло не дремлет, а я добрый...
 
spiker
Ну да, конечно.
Лучше заниматься онанизмом до посинения с одной функцией php, пытаясь выжать из неё всё мыслимое и немыслимое.
А не использовать всё разнообразие PHP.
Массивы и foreach() это же такая страшная штука, сравнимая с андронным коллайдером...
Их же никто не использует для работы с текстом )) .
Извини что отвлёк.
 
Zaxap
spiker, просто разбираюсь с регулярками; встал в тупик, когда потребовалось заменить строку с \n...
По-моему не так выбираю... но, вроде бы, так...
Изменил(а) Zaxap, 01.06.2014 15:52
Зло не дремлет, а я добрый...
 
spiker
Регулярки в PHP используются столь мало, что не стоит обращать на них особого внимания и терять время. Это же не Perl.
 
Polarfox
Это шутка такая? Или сарказм?
Регулярки нужны везде где есть данные в виде текста.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме
 
spiker
Я и не писал, что они не нужны.
Просто они не панацея от всех бед, поиск и манипуляции с текстом всего-лишь.
Помог бы тов. Захару лучше с переносом строк, а не умничал.
Я вижу решение проблемы, используя массив. Запустить каждую строку по циклу и чистить от переносов.
x1
 
Zaxap
Сделал так:
$text=preg_replace("@<br />\r\n@si","</p>\n<p>",$text);

Как оказалось, не хватало \r...

---

Объединено 07.06.2014 08:50:
Загрузить источник  GeSHi: PHP
  1. //...
  2. $shows=preg_replace("@<a href='(.*?)' class='ops'>(.*?)</a>@si","<a href='$1' class='hops'>$2</a>",$rock);
  3. $s=array(
  4. "@<img src='(.*?)' alt='(.*?)' class='img'>@si",
  5. //...
  6. }
  7. $r=array(
  8. "@<img src='(.*?)' alt='(.*?)' class='img'>".$shows,
  9. //...
  10. }
  11. $rocks=preg_replace($s,$r,$rocks);
  12. //...
Добавлено за 0.024 секунд, используя GeSHi 1.0.8.10


Но оно выводится как-то странно...

Честно сказать, мне кажется, что так сделать не получится...

---

Как выбрать для замены все символы между двумя тегами?
Например, что-то такое:
Загрузить источник  GeSHi: PHP
  1. $why="<aside><a href='(.*?)' class='link'><img src='(.*?)' alt='(.*?)' title='(.*?)' /></a><div class='right'>
  2. <a style='color:#555'>(.*?)
  3. </a></div></aside>";
  4. $die=preg_replace("<aside><a href='(.*?)' class='link'> /***/ </div></aside>","<a href='$1' class='link'> /***/ </a>",$why);
  5. /***/ - тут должно быть (регулярка) нечто типа (.*?), только выбирающее все между тегами до и после...
Добавлено за 0.022 секунд, используя GeSHi 1.0.8.10

(к коду не придирайтесь, он импровизированный, чисто для примера тут:))
Изменил(а) Zaxap, 07.06.2014 03:34
Зло не дремлет, а я добрый...
 

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум: