Фильтр URL с регулярным выражением в PHP - PullRequest
0 голосов
/ 26 апреля 2020

Кто-нибудь готов помочь мне отфильтровать URL с помощью регулярных выражений? Я прошел довольно далеко, но наткнулся на один последний вопрос.

Сценарий:

  1. Пользователь отправляет ссылку на свою песню SoundCloud в Gravity. Поле веб-сайта форм.
  2. Сценарий автоматически объявляет https: // автоматически, если пользователь не добавляет его.
  3. Удаляет www. и м. из URL.
  4. Иногда отправляется ссылка с частным расширением URL: https://soundcloud.com/username/songtitle/s-qciX1vDI2Cq

Что можно сделать, чтобы скрипт также удалял s-qciX1vDI2Cq тоже с URL?

Пример ввода http://www.soundcloud.com/username/songtitle/s-qciX1vDI2Cq

Пример вывода https://soundcloud.com/username/songtitle

Заранее большое спасибо!

add_filter( 'gform_pre_render', 'itsg_check_website_field_value' );
add_filter( 'gform_pre_validation', 'itsg_check_website_field_value' );
function itsg_check_website_field_value( $form ) {
    foreach ( $form['fields'] as &$field ) {  // for all form fields
        if ( 'website' == $field['type'] || ( isset( $field['inputType'] ) && 'website' == $field['inputType']) ) {  // select the fields that are 'website' type
            $value = RGFormsModel::get_field_value($field);  // get the value of the field

            if (! empty($value) ) { // if value not empty
                $field_id = $field['id'];  // get the field id

                if (! preg_match("~^(?:f|ht)tps?://~i", $value) ) {  // if value does not start with ftp:// http:// or https://
                    $value = "https://" . $value;  // add https:// to start of value
                }

                if ( preg_match("/(https?:\/\/)(www\.|m\.)?soundcloud\.com\/([^\s\n]+)\/([^\s\n]+)\/([^\s\n]+)", $value)) {
                    $temp = explode("/", $value);
                    array_pop($temp);
                    $value = implode("/", $temp);
                }


                preg_match("/(https?:\/\/)(www\.|m\.)?([^\s\n]+)(\/+)?/", $value, $extractedDomain);
                $value = "https://" . $extractedDomain[3];

                preg_match('/^(.*?)(\?.*)?$/', $value, $noSearch);
                $value = trim($noSearch[1], '/') . '';

                $_POST['input_' . $field_id] = $value; // update post with new value
            }
        }
    }
    return $form;
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Используйте regex pattern

^(?:https?:\/\/|)(?:www|m)\.(soundcloud\.com\/[^\/]+\/[^\/]+)(?:\/.*?|)$

и выполните замену на

http://$1

Проверьте его и посмотрите объяснение (в правом верхнем углу) на https://regex101.com/r/mwa4JP/1


См. PHP демо на https://www.ideone.com/rdKb3P

preg_replace("/^(?:https?:\/\/|)(?:www|m)\.(soundcloud\.com\/[^\/]+\/[^\/]+)(?:\/.*?|)$/",
             "http://$1", $input);

Для приема заглавных букв в необязательные префиксы www. и m. и / или в имени домена soundcloud.com, добавьте модификатор i regex:

/^(?:https?:\/\/|)(?:www|m)\.(soundcloud\.com\/[^\/]+\/[^\/]+)(?:\/.*?|)$/i
0 голосов
/ 26 апреля 2020

Я бы go для регулярного выражения '///'

$url = 'http://www.soundcloud.com/username/songtitle/s-qciX1vDI2Cq';
$regex = '/\//';
$a = preg_split($regex, $url);
print_r($a);

вывод:

Array
(
    [0] => http:
    [1] =>
    [2] => www.soundcloud.com
    [3] => username
    [4] => songtitle
    [5] => s-qciX1vDI2Cq
)

Теперь вы можете объединить эти элементы от 0 до 4, чтобы дать правильный URL.

...