How to replace specific characters with an element tag in PHP
Asked Answered
G

4

10

I wanted to make a PHP function that would make text bold between double asterisks, and italic between one asterisk, (quite like the editor on Stack Overflow).

The same rules apply, if there's a space between the * and the word, it shouldn't render.

I tried, but I only came this far, as I don't know how to make the odd asterisks <b> and the even ones </b>:

$thenewtext = str_replace("**", "<b>", "**Hello World** of PHP");
Glutinous answered 8/10, 2013 at 16:57 Comment(2)
Regular expressions will work for this simple example. But please consider choosing a parser. Using regular expressions with HTML can drive some people to drink.Tagmemics
@John: OP seems to be transforming plain text into HTML, not parsing HTML, so regular expressions should be just fine.Becharm
B
22

A simple regex will do the trick:

$thenewtext = preg_replace('#\*{2}(.*?)\*{2}#', '<b>$1</b>', '**Hello World** of PHP');
Becharm answered 8/10, 2013 at 19:36 Comment(2)
'#\*{2}([^*]*)\*{2}#' would be a little faster.Cate
Hmm... this doesn't allow me to have a bold string containing three asterisks. Should it?Effluent
E
1

Let's show some fringe cases in the input. In my snippet, I'll be using lookarounds to ensure that asterisks are not greater than 2 and that a space is not permitted just inside the beginning/ending double-asterisks.

There is some subjective interpretation as to how these fringe cases should be handled, but I can at least say that this pattern makes an attempt to replace the space-disqualification that is demanded in the posted question.

Code: (Demo)

$string = 'start ** not bold ** and **bold** not bold **bold *** still bold** not bold **** not bold ****';
// bad space------⬏
// completely valid triple asterisk should not break styling-⬏
// more than 2 consecutive asterisks should not trigger styling?----------------------⬏⬏

echo preg_replace('/(?<!\*)\*\*(?![\s*])(.*?)(?<![\s*])\*\*(?!\*)/', '<b>$1</b>', $string);

Output:

start ** not bold ** and <b>bold</b> not bold <b>bold *** still bold</b> not bold **** not bold ****
Effluent answered 1/8, 2021 at 10:27 Comment(0)
I
-1

I am not too familiar with it but you are going to need a Regular Expression. Look into preg_replace()

I recently implemented a server-side text highlighting system to complement jQuery UI's AutoComplete.

My adaptation of your idea would be something like this:

$txt = 'not bold [BeginBold]Yes Bold[EndBold] not bold again';

$newtxt = str_replace("[BeginBold]", "<b>", $txt);
$newtxt = str_replace("[EndBold]", "</b>", $txt);
echo $newtxt;

this would produce:

not bold Yes Bold not bold again

Infirmity answered 8/10, 2013 at 17:5 Comment(2)
The double asterisk seems more elegant … its not only less to write but also you can switch seamlessly to markdown.Febricity
@JohannesGrandy My answer only serves as a starting point for ideas since you could implement features not readily available in markdown. If you want a full-fledged markdown conversion using PHP then just get something pre-built such as parsedown.orgInfirmity
M
-1

Update: After further investigation, I found this new solutions.

Using preg_replace

In the first approach, the preg_replace function is used to search for any content between double quotes in the $content string and replace it with the same content wrapped in tags. Here's how it works:

<?php
function quote_filter($content)
{
    $content = preg_replace('/"([^"]*)"/', '<q>$1</q>', $content);
    return $content;
}

preg_replace looks for a pattern defined by the regular expression /"([^"]*)"/.

Using preg_replace_callback

The second approach uses preg_replace_callback, which is a bit more flexible and allows more complex processing of the matched content. Here’s how it works:

<?php

function quote_filter($content)
{
    $content = preg_replace_callback('/"([^"]*)"/', function ($matches) {
        return '<q>' . $matches[1] . '</q>';
    }, $content);
    return $content;
}

preg_replace_callback works similarly to preg_replace but instead of directly replacing the matches, it will allow you to use a callback function to process the matches.

Please let me know if any another query.

Merc answered 28/8 at 5:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.