PHP regex - найти и заменить знак подчеркивания хештега дефисом - PullRequest
0 голосов
/ 14 июня 2019

У меня есть ссылка на ссылку, как показано ниже:

<a href="#_what_are_classes">What are classes</a>

заменить на регулярное выражение

<a href="#what-are-classes">What are classes</a>

таким же образом измените DIV с

<div id="_what_are_classes" class="padTop"></div>

с использованием регулярного выражения

<div id="what-are-classes" class="padTop"></div>

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Это заменит все <a href и все <div id, которые содержат подчеркивания.

$string = '<a href="#_what_are_classes">What are classes</a>

   <div id="_what_are_classes" class="padTop"></div>';

$res = preg_replace_callback(
            '/(?:<a.*?href="|<div.*?id=")\K[^"]+/',
            function ($m) {
                // remove the # and _ at the beginning
                // then replace _ with -
                return str_replace('_','-',preg_replace('/^#?_/', '', $m[0]) );
            },
            $string);
echo $res;

Выход:

<a href="what-are-classes">What are classes</a>

   <div id="what-are-classes" class="padTop"></div>

Пояснение:

(?:                 # start non capture group
    <a.*?href="     # a href
  |                 # OR
    <div.*?id="     # div id
)                   # end group
\K                  # forget all we have seen until this posiiton
[^"]+               # 1 or more not quote
1 голос
/ 14 июня 2019

Эта функция заменяет упомянутые вами атрибуты HTML, но вам, возможно, придется настроить его для HTML вне предоставленных вами примеров:

<?php

function convert_hrefs_and_ids($text) {
    $replace = static function($str) {
        $prefix = str_replace('_', '', $str[2]);
        $attribute = str_replace('_', '-', $str[3]);
        return $str[1] . '="' . $prefix . $attribute . '"';
    };
    $text = preg_replace_callback('/(a.+href)="(#_)([a-z0-9_]+)"/Ui', $replace, $text);
    $text = preg_replace_callback('/(div.+id)="(_)([a-z0-9_]+)"/Ui', $replace, $text);
    return $text;
}

Если вы хотите использовать его с Wordpress, вы можете взятьпосмотрите на Wordpress API для фильтров содержимого и используйте его так:

<?php

add_filter('the_content', 'convert_hrefs_and_ids');
...