最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Adding span tags to post titles using regex

programmeradmin2浏览0评论

My basic titles are something like

Part One: Part Two

And I'm trying to end up with something like this using the colon as what I find in the regex:

<span class="one-class">Part One:</span><br><span class="two-class">Part Two</span>

This is the original in entry-header.php and I want to continue to have that html:

if ( is_singular() ) {
            the_title( '<h1 class="entry-title">', '</h1>' );
        }
    

The following works as long as there is a colon in the title. If there is no colon, then none of the html gets added.

if ( is_singular() ) {
                        $string = get_the_title();
            $pattern = '~(.+): (.+)~i';
            $replacement = '<h1 class="entry-title"><span class="title-cite-pali">$1:</span><br><span class="title-english">$2</span></h1>';
            echo preg_replace($pattern, $replacement, $string);
        }
    

But I think what I really want is the following, but it doesn't work. The output is as if my added code is not there.

if ( is_singular() ) {
            $string = the_title( '<h1 class="entry-title test">', '</h1>' );
            $pattern = '~(.+): (.+)~i';
            $replacement = '<span class="title-cite-pali">$1:</span><br><span class="title-english">$2</span>';
            echo preg_replace($pattern, $replacement, $string);
            
        }
    

I think if I could get the above code working, it is preferable since if there was no colon at least the h1 tags would be added.

My basic titles are something like

Part One: Part Two

And I'm trying to end up with something like this using the colon as what I find in the regex:

<span class="one-class">Part One:</span><br><span class="two-class">Part Two</span>

This is the original in entry-header.php and I want to continue to have that html:

if ( is_singular() ) {
            the_title( '<h1 class="entry-title">', '</h1>' );
        }
    

The following works as long as there is a colon in the title. If there is no colon, then none of the html gets added.

if ( is_singular() ) {
                        $string = get_the_title();
            $pattern = '~(.+): (.+)~i';
            $replacement = '<h1 class="entry-title"><span class="title-cite-pali">$1:</span><br><span class="title-english">$2</span></h1>';
            echo preg_replace($pattern, $replacement, $string);
        }
    

But I think what I really want is the following, but it doesn't work. The output is as if my added code is not there.

if ( is_singular() ) {
            $string = the_title( '<h1 class="entry-title test">', '</h1>' );
            $pattern = '~(.+): (.+)~i';
            $replacement = '<span class="title-cite-pali">$1:</span><br><span class="title-english">$2</span>';
            echo preg_replace($pattern, $replacement, $string);
            
        }
    

I think if I could get the above code working, it is preferable since if there was no colon at least the h1 tags would be added.

Share Improve this question asked Jul 7, 2020 at 14:50 HopefullCoderHopefullCoder 456 bronze badges 3
  • 1 If you want the_title() function to return its result instead of echoing it, you should use $string = the_title( '<h1 class="entry-title test">', '</h1>', false ); – Ivan Shatsky Commented Jul 7, 2020 at 15:04
  • 1 so do you need to allow for the case with no colon? what should happen then? why not just add that case to your first piece of code if it's working ;-) – mozboz Commented Jul 7, 2020 at 15:11
  • 1 You don't need regex, just split the string by the : character and wrap the array items in span tags. A regular expression is just overcomplicating it ( and you shouldn't parse HTML with regex anyway ) – Tom J Nowell Commented Jul 7, 2020 at 15:30
Add a comment  | 

2 Answers 2

Reset to default 1

It's nice to use regex, but you can also achieve the same thing here by just splitting the string on ':' with explode e.g.:

    $matches = explode(":", get_the_title()) ;

    if (count($matches) == 2) {
       $result = "foo bar $matches[0] foo bar $matches[1]";
    } else {
       // case with no : in title
       $result = "foo bar $matches[0] foo bar";
    }
    echo $result;

You don't need a regex.

First, grab the title as a string variable:

$title = get_the_title();

Then, find the location of the first colon:

$colon = strpos( $title, ':' );

If there is no colon, handle that:

if ( $colon === FALSE ) {
    // there was no colon, handle that!
    echo '<h2>' . esc_html( $title ) . '</h2>';
} else {
    // the rest of the code
}

What about the rest of the code that goes in the else? Well, lets split it in two:

$first_part = substr( $title, 0, $colon );
$second_part = substr( $title, $colon + 1, strlen( $title ) );

Now we can output them differently:

echo '<span>' . $first_part . '</span>';
echo '<span>' . $second_part . '</span>';
发布评论

评论列表(0)

  1. 暂无评论