1

これを正規表現に置き換えました(phpbbソースコードから取得したものです)。

$match = array(
                '#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="(.*?)" target\=\"_blank\">.*?</a><!\-\- \1 \-\->#',
                '#<!\-\- .*? \-\->#s',
                '#<.*?>#s',
            );
$replace = array( '\2',  '', '');

$message = preg_replace($match, $replace, $message);

このようなメッセージを実行すると

asdfafdsfdfdsfds
<!-- m --><a class="postlink" href="http://website.com/link-is-looooooong.txt">http://website.com/link ... oooong.txt</a><!-- m -->
asdfafdsfdfdsfds4324

これを返す

asdfafdsfdfdsfds
http://website.com/link ... oooong.txt
asdfafdsfdfdsfds4324

ただし、置換機能にしたいと思います。したがって、href を指定することで、ブロック内のリンク タイトルを置き換えることができます。

URL、新しい URL、新しいタイトルを提供したいと思います。したがって、これらの変数を使用して正規表現を実行できます。

$url = 'http://website.com/link-is-looooooong.txt';
$new_title = 'hello';
$new_url = 'http://otherwebsite.com/';

そして、同じ生のメッセージを返しますが、リンクが変更されています。

<!-- m --><a class="postlink" href="http://otherwebsite.com/">hello</a><!-- m -->

私はそれをこのようなものに微調整しようとしましたが、うまくいきません。一致した結果を構築する方法がわからないため、置換後も同じ形式になります。

$message = preg_replace('#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="'.preg_quote($url).'" target\=\"_blank\">(.*?)</a><!\-\- \1 \-\->#', $replace, $message);
4

2 に答える 2

1

正規表現を使用して HTML を解析するのは面倒で、非常に複雑になることがあります。あなたの最善の策は、このようなDOM パーサーを使用し、代わりにそれを使用してリンクを変更することです。

于 2011-11-28T16:09:48.387 に答える
0

他のパーツもグループでキャッチして、交換に使用する必要があります。このようなことを試してください:

$replace = '\1http://otherwebsite.com/\3hello\4';
$reg = '#(<!-- ([mw]) --><a (?:class="[\w-]+" )?href=")'.preg_quote($url).'("(?: target="_blank")?>).*?(</a><!-- \2 -->)#';
$message = preg_replace($reg, $replace, $message);

ここを参照してください。

于 2011-11-28T16:41:01.880 に答える