1

番組の評価を表す複数の * を含む文字列があります。個人の * を評価以外の何かを表すために使用する場合があるため、2 つ以上が一緒にある場合 (例: **)、これらのみが評価を表すと想定します。

表示を改善するために、評価に含まれる * を★ (& #9733;) に変更したいと考えています。

現在、次のように preg_replace を使用して、* が 2 つ以上出現した場合に一致させています。

$blurb = preg_replace("/[\*]{2,}/", "★", $s['longDescription']);

ただし、これは何回出現しても★を 1 つだけ配置します。これを変更して各オカレンスを置き換えるにはどうすればよいですか?

**★★に***なる、★★★になるなど。

4

2 に答える 2

4

これと にカスタム コールバックを使用できますpreg_replace_callback()

$blurb = preg_replace_callback("/([\*]{2,})/", function( $match) { 
    return str_repeat( "★", strlen( $match[1])); }
, $s['longDescription']);

の入力文字列を使用すると*****、次のように出力されます。

★★★★★

PHP < 5.3 では無名関数を使用できないため、上記のコールバックをスタンドアロン関数として宣言する必要があります。ただし、超超クールになりたい場合は、正規表現を変更してアサーションを使用し、次のように 1 つのアスタリスクの前後にあるすべてのアスタリスクを見つけることができます。

$s['longDescription'] = 'replace these ***** not this* and *** this ** ****';
$blurb = preg_replace("/(?:(?<=\*)|(?=\*\*))\*/", "&#9733;", $s['longDescription']);

正規表現は、現在の位置から、アスタリスクを見ただけか、前に 2 つのアスタリスクを見たかを確認します。これらの主張のいずれかが真である場合、アスタリスクを 1 つ取得しようとします。

これは出力します

replace these &#9733;&#9733;&#9733;&#9733;&#9733; not this* and &#9733;&#9733;&#9733; this &#9733;&#9733; &#9733;&#9733;&#9733;&#9733;
于 2013-06-22T23:26:23.033 に答える
0

文字クラス内でアスタリスクをエスケープする必要はありません。これはリテラルと見なされるためです。ただし、外側ではエスケープする必要があります。

$blurp = preg_replace('~(?<=\*)\*|\*(?=\*)~', '&#9733;', $yourString);

アイデアは(制限が2であるため)、*の後に続く、または前にある*を1つずつ置き換えることです*

于 2013-06-22T23:33:06.833 に答える