Как заменить символы в регулярном выражении preg replace только в знаке доллара 1 ($ 1)? - PullRequest
0 голосов
/ 12 июня 2018

Допустим, у меня есть этот preg replace:

$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href=$1">$1</a>', $emailnote);

Он заменяет текстовые URL на кликабельные ссылки, но в нужном мне формате, потому что мне нужно обработать этот клик определенным образом, прежде чем перенаправить его на ихконечное назначение.В любом случае, вы видите два знака доллара 1 (1 доллар)?Я хочу заменить символы для первого, но не для второго, а также я хочу заменить символы только для текста после href =, а не для всей строки / переменной $ emailnote.мне нужно преобразовать любые амперсанды в HTML для амперсанда (&), но только для значения параметра href.не амперсанд прямо перед href = и нигде в emailnote.

Например, примечание может иметь следующее:

http://example.com/folder/?something&ok blah blah blah & blah

Когда форма отправляется с этим текстом в текстовом поле, и яиди, чтобы обработать это.У меня есть база данных, сохраняющая ее в точности как есть, а затем я также отправляю ее по электронной почте, и мне нужно только преобразовать ее для электронной почты.Мне нужно письмо, чтобы отобразить его так:

<a href="http://example2.com/index/goto.php?file_id=123&href=http://example.com/folder/?something&amp;ok">http://example.com/folder/?something&ok</a> blah blah blah & blah

Вещи, которые я пробовал, которые не работают ...

Вещь 1:

$emailnote = str_replace('&','&amp', preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href=$1">$1</a>', $emailnote));

Вещь 2:

function ampReplace($str) {
    $str = str_replace('&', '&amp;', $str);
    return $str;
}
//only 1 of these at a time, not all at once...
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace($1).'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace('$1').'">$1</a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.ampReplace("$1").'">$1</a>', $emailnote);

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ

не обращайте внимания на URL, кодирующее все значение параметра href, а не просто конвертирующееамперсанд, но как мне это сделать?

например, вывод будет таким, но, как я уже сказал, я не знаю, как этого добиться:

<a href="http://example2.com/index/goto.php?file_id=123&href=http%3A%2F%2Fexample.com%2Ffolder%2F%3Fsomething%26ok">http://example.com/folder/?something&ok</a> blah blah blah & blah

РЕДАКТИРОВАТЬ

Следующие вещи, которые я пробовал, не работали.

//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\\1').'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\$1').'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('$1').'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("$1").'">$1</a>', $emailnote);
//$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode('\\$1').'">$1</a>', $emailnote);
$emailnote = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="'.SITE_DOMAIN.'index/goto.php?file_id='.$id.'&href='.urlencode("\\$1").'">$1</a>', $emailnote);

1 Ответ

0 голосов
/ 12 июня 2018

Решение было preg_replace_callback, о котором я упоминал несколько раз, но не знал, как его реализовать, но я понял.

$emailnote = preg_replace_callback("@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@",
function($matches) {
    return "<a href=\"".SITE_DOMAIN."index/goto.php?file_id=".$id."&href=".urlencode($matches[1])."\">".$matches[1]."</a>";
},
$emailnote);

Следующая строка возврата может работать лучше, еслиамперсанд конвертируется в это:% 26amp% 3B --- это должно быть просто% 26

return "<a href=\"".SITE_DOMAIN."index/goto.php?file_id=".$_POST['id']."&href=".urlencode(str_replace('&amp;','&',$matches[1]))."\">".$matches[1]."</a>";
...