AS2 Multi string заменить - PullRequest
       5

AS2 Multi string заменить

1 голос
/ 28 ноября 2011

Новичок здесь:)

Сначала мой код AS2:

txt.html=true;
txt.htmlText="This is an example: www.sample.com is not www.othersample.com";
var sampleText:String=findUrl(txt.text);
trace(sampleText);
function findUrl(str){
    var rawURL:Array = new Array();
    rawURL = str.split(' ');
    for(var i=0; i<rawURL.length; i++) {
        if(rawURL[i].indexOf("http://") != -1 or rawURL[i].indexOf("www.") != -1)    {
            return (str.replace(rawURL[i], "<a href='"+rawURL[i]+"' target='_blank'><u><font color='#666666'>"+rawURL[i]+"</font></u></a>"));
        }
    }
}

Выход:

This is an example: <a href='www.sample.com' target='_blank'><u><font color='#666666'>www.sample.com</font></u></a> is not www.othersample.com

Первый вопрос: почему моя функция флеш-памяти всегда заменяет только первый URL?

Я пытаюсь отправить строку из текстового поля флеш-ввода с помощью PHP в таблицу mySQL. Затем, когда флэш-память загрузится снова, все URL-адреса в моем текстовом поле флэш-памяти будут активными.

Конечно, я могу использовать preg_replace в PHP:

$comments = $_POST['comments'];
$comments = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2", $comments);
$comments = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i", "<u><A TARGET=\"_blank\" HREF=\"$1\"><font color=\"#666666\">$1</font></A></u>", $comments);

но проблема в том, что эта строка редактируется во флэш-памяти, поэтому, когда я отправляю ее (отредактированную) обратно в PHP, PHP перезаписывает ссылки и делает их нечитаемыми для флэш-памяти (пример):

<u><a target="_blank" href="<u><a target="_blank" href="http://asdasd.asdasd.pl"><font color="#666666">http://asdasd.asdasd.pl</font></a></u>"><font color="#666666"><u><a target="_blank" href="http://asdasd.asdasd.pl"><font color="#666666">http://asdasd.asdasd.pl</font></a></u></font></a></u>

Я также могу использовать некоторую функцию PHP, которая будет проверять, содержат ли отправленные данные из flash уже кликабельные URL, но если мне нужно добавить еще одну ссылку в редактируемую строку, preg_replace не запускается ...

Есть ли способ сделать то, что мне нужно?

Заранее спасибо, Артур.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

[[EDIT]]

Строка 32 изменена с:

last = lowest.end;

на:

last = lowest.end + idx;

Как я уже упоминал в комментарии ... действительно дует код немного.Альтернативой является использование существующей библиотеки регулярных выражений AS2.Последнее, что я посмотрел (5 лет назад), реализации регулярного выражения AS2 не было на 100% в отношении поддержки выражений.Я уверен, что есть более короткий путь к этому, но вот код после первой попытки:

String.prototype.replace = function(search:String, replace:String):String
{
    return this.split(search).join(replace);
}

function linkPaths(text:String, template:String):String
{
    var idx:Number;
    var lowest:Object;

    var selectors:Array =
    [
        "http://",
        "www."
    ];

    var sub:String;
    var last:Number = 0;
    var result:String = "";

    for(idx=0; idx<text.length; idx++)
    {
        sub = text.substring(idx);
        lowest = findLowestSelector(sub, selectors);

        if(!lowest)
        {
            break;
        }

        result += text.substring(last, lowest.start + idx) + template.replace("${url}", sub.substring(lowest.start, lowest.end));
        last = lowest.end + idx;
        idx += lowest.end;
    }

    return result;
}

function findLowestSelector(text:String, selectors:Array):Object
{
    var idx:Number;
    var index:Number;

    var start:Number = Number.MAX_VALUE;
    var end:Number = -1;

    for(idx=0; idx<selectors.length; idx++)
    {
        index = text.indexOf(selectors[idx]);

        if
        (
            index != -1 &&
            index < start
        )
        {
            start = index;

            index = text.indexOf(" ", start);
            end = index == -1 ? text.length : index ;
        }
    }

    return start != -1 ?
        {
            start: start,
            end: end
        }
        :
        null
    ;
}

trace(linkPaths
(
    "test text here http://www.test.com is a link, along with www.test.com",
    "<a href='${url}' target='_blank'><u><font color='#666666'>${url}</font></u></a>"
));

Дайте мне знать, если есть какие-либо проблемы.Метод findLowestSelector использует один пустой пробел или конец строки для указания конечного значения в возвращаемом объекте.

Уже давно, как я работал с AS2 ...

Best ofудачи!

0 голосов
/ 28 ноября 2011

Нашел и другое решение - PHP.

функция ween_replace получил: http://dk2.php.net/manual/en/function.str-replace.php#104072

Код:

<?
$sample=$_POST['sample'];

$sample = ereg_replace("[\]", "", $sample);
between_replace ('<u><a target="_blank" href="','">', $sample, "");
$sample = str_replace('<u><a target="_blank" href="', "", $sample);
$sample = str_replace('"><font color="#666666">http://', "", $sample);
$sample = str_replace("</font></a></u>", "", $sample);
$sample = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2", $sample);
$sample = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i", "<u><a target=\"_blank\" href=\"$1\"><font color=\"#666666\">$1</font></a></u>", $sample);
$sample = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<u><a href=\"mailto:$1\"><font color=\"#666666\">$1</font></a></u>",$sample); 
$sample = ereg_replace("[\n]", "\n", $sample);
$sample = ereg_replace("[']", "''", $sample);

echo "&sampletext=" . $sample."&";

function between_replace ($open, $close, &$in, $with, $limit=false, $from=0)
{
if ($limit!==false && $limit==0)
{
    return $in;
}        
$open_position = strpos ($in, $open, $from);
if ($open_position===false)
{
    return false;
};
$close_position = strpos ($in, $close, $open_position+strlen($open));
if ($close_position===false)
{
    return false;
};
$current = false;
if (strpos($with,'{*}')!==false)
{
    $current = substr ($in, $open_position+strlen($open), $close_position-$open_position-strlen($open));
    $current = str_replace ('{*}',$current,$with);
    //debug_echo ($current);
}
else
{
    $current = $with;
}
$in = substr_replace ($in, $current, $open_position+strlen($open), $close_position-$open_position-strlen($open));
$next_position = $open_position + strlen($current) + 1;
if ($next_position>=strlen($in))
{
    return false;
}
if ($limit!==false)
{
    $limit--;
}        
between_replace ($open, $close, $in, $with, $limit, $next_position);
return $in;
}
?>
...