0

これに似た文字列があります

$string='@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)';

@タグ付けされた単語が存在することを示し、タイプとmain_id. 私の目標は、タグ付けされた単語を次のようにリンクすることです。

<a href="/user.php?id=529">@Carlos</a> is going to rock <a href="/city.php?id=111">@NEW YORK</a>

印刷されると、Carlos と New York のリンクを含む次のようになります。

@Carlos は @NEW YORK をロックする予定です

を使用substr_countすると、タグの数を知ることができます。2 つの区切り記号の間の文字列を取得する関数があります。

function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);

私はこれにアプローチする方法にこだわっています。どんな提案も役に立ちます。

4

2 に答える 2

1

正規表現 (preg_match/preg_match_all/preg_replace) を使用します。サンプルコード:

<?php
$string='@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)';

print preg_replace('/@\[([^]]+)\]\(\{([a-z]+)\}:([0-9]+)\)/i', '<a href="/\2.php?id=\3">@\1</a>', $string);

?>

ただし、セキュリティのために、タグで htmlspecialchars() を実行するために preg_replace_callback を使用することもできます。タイプの urlencode() と同様に。そのようです :

function tag2url($matches) {
  $tag = $matches[1];
  $type = $matches[2];
  $id = $matches[3];
  return '<a href="/' . urlencode($type) . '.php?id=' . urlencode($id) . '">' . htmlspecialchars($tag) . '</a>';
}

print preg_replace_callback('/@\[([^]]+)\]\(\{([a-z]+)\}:([0-9]+)\)/i', "tag2url", $string);
于 2013-03-15T15:08:22.450 に答える
0

データは適切な形式で、正規表現に最適です。

次のようなものを使用します。

/@\[([\w\s]*)]\({(\w*)}:(\d*)\)/

これは、その後に が@続く記号を探します。[<words>]({<word>}:<number>)

を使用preg_replaceして、文字列をリンクに一度に置き換えることができます。

$string = '@[Carlos]({user}:529) is going to rock @[NEW YORK]({city}:111)';
$regex = '/@\[([\w\s]*)]\({(\w*)}:(\d*)\)/';

$newString = preg_replace($regex, '<a href="/$2.php?id=$3">@$1</a>', $string);

デモ: http://ideone.com/EYf4KR

于 2013-03-15T15:20:49.420 に答える