JHtml- "email.cloak" не распознает адрес электронной почты при использовании preg_replace () в joomla - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь заменить адрес электронной почты в тексте в модуле на php, используя JHtml::_("email.cloak", "some@email.com"), чтобы скрыть его на веб-странице joomla 3.9.2.

, используя следующий пример кода:

<div>
<?php
    $text = "This is a text with some@email.com an e-mail address in it";
    $test_text_email = "some@email.com";
    echo JHtml::_("email.cloak", $test_text_email)."<br>";
    echo preg_replace('/([a-zA-Z0-9_\-\.]*@\\S+\\.\\w+)/', JHtml::_("email.cloak", "$1"),$text)."<br>";
?></div>

Jhtml: _ ("email.cloak", ... прекрасно работает, когда просто передает простую строку (см. $ Test_text_email ниже). При поиске адреса электронной почты в тексте с использованием preg_replace, электронная почтаподстрока найдена правильно, но маскировка не работает должным образом, так как функция, кажется, больше не распознает символ "@" со следующим результатом:

<span id="cloak7c9ea7a5340755f2f7e1d4f0c8b45675"><a href="mailto:some@email.com">some@email.com</a></span>
This is a text and <span id="cloak88a24a939973cdd7ec9f3d1fb591b7a5"><a href="mailto:some@email.com@">some@email.com@</a></span> an e-mail address 

Сгенерированный javascript подтверждает правильную найденную подстрокуby preg_replace (), но без маскировки, в конце добавляется только символ @ (@).

<script type="text/javascript">
            document.getElementById('cloak3fd71e407852d6d7593b726a0f41ca38').innerHTML = '';
            var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
            var path = 'hr' + 'ef' + '=';
            var addy3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '&#64;';
            addy3fd71e407852d6d7593b726a0f41ca38 = addy3fd71e407852d6d7593b726a0f41ca38 + '';
            var addy_text3fd71e407852d6d7593b726a0f41ca38 = 'some@email.com' + '&#64;' + '';document.getElementById('cloak3fd71e407852d6d7593b726a0f41ca38').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy3fd71e407852d6d7593b726a0f41ca38 + '\'>'+addy_text3fd71e407852d6d7593b726a0f41ca38+'<\/a>';
    </script>

Правильная строка в скрипте показана ниже:

    var addy1ef8a36d65e0cc59448f875761cc1465 = 's&#111;m&#101;' + '&#64;';addy1ef8a36d65e0cc59448f875761cc1465 = addy1ef8a36d65e0cc59448f875761cc1465 + '&#101;m&#97;&#105;l' + '&#46;' + 'c&#111;m';

Есть идеи, почему строки обрабатываются по-разному? Заранее спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Вы не можете выполнять манипуляции с параметром замены preg_replace(). Вам нужно будет позвонить preg_replace_callback().

Код: ( Демо )

$text = "This is a text with some@email.com an e-mail address in it";

echo preg_replace_callback(
        '~[\w.-]+@(?:[\w-]+\.)+\w+~',
        function($m) {
            return JHtml::_("email.cloak", $m[0]);
        },
        $text
     );
  • a-zA-Z0-9_ проще сжать до \w
  • . не нужно экранировать в классе символов.
  • - не нужно экранировать, если он находится в начале или конце класса символов или если он непосредственно следует за «диапазоном символов» в классе символов (например, 0-9-).
  • вам не нужны эти двойные косые черты в вашем шаблоне
  • жадный + после \S может быть плохой идеей в некоторых сценариях
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...