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 stackoverflow).

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

Who can help me out? I tried to, but I only came this far, as I don't know how to make the odd asterisks "< b >" and the even ones "< /b >".

(I can't type them without the spaces, stackoverflow will render the text between as bold.....)

$thenewtext = str_replace("**", "<b>", "**Hello World** of PHP");
4

3 回答 3

21

A simple regex will do the trick:

$thenewtext = preg_replace('#\*{2}(.*?)\*{2}#', '<b>$1</b>', '**Hello World** of PHP');
于 2013-10-08T19:36:04.107 回答
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 ****
于 2021-08-01T10:27:05.847 回答
-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

于 2013-10-08T17:05:14.973 回答