preg_place非字母,保留单个空格

2022-03-22 00:00:00 regex php preg-replace

正如标题所示,我正在尝试替换所有非字母字符,并将所有双(或更多)空格替换为单个空格。我就是绕不开空格的东西。

到目前为止我的preg_replace行:

$result = trim( preg_replace( '/s+/', '', strip_tags( $data->parent_label ) ) );

注意:strip_tagstrim是必需的。


编辑:这是我想出来的:

/**
 * Removes all non alpha chars from a menu item label
 * Replaces double and more spaces into a single whitespace
 * 
 * @since 0.1
 * @param (string) $item
 * @return (string) $item
 */
public function cleanup_item( $item )
{
    // Regex patterns for preg_replace()
    $search = [
        '@<script[^>]*?>.*?</script>@si', // Strip out javascript 
        '@<style[^>]*?>.*?</style>@siU',  // Strip style tags properly 
        '@<[/!]*?[^<>]*?>@si',          // Strip out HTML tags
        '@<![sS]*?–[ 	
]*>@',       // Strip multi-line comments including CDATA
        '/s{2,}/',
        '/(s){2,}/',
    ];
    $pattern = [
        '#[^a-zA-Z ]#', // Non alpha characters
        '/s+/',        // More than one whitespace
    ];
    $replace = [
        '',
        ' ',
    ];
    $item = preg_replace( $search, '', html_entity_decode( $item ) );
    $item = trim( preg_replace( $pattern, $replace, strip_tags( $item ) ) );

    return $item;
}

可能最后的strip_tags()不是必需的。只是为了确保它在那里。


解决方案

$patterns = array (
  '/W+/', // match any non-alpha-numeric character sequence, except underscores
  '/d+/', // match any number of decimal digits
  '/_+/',  // match any number of underscores
  '/s+/'  // match any number of white spaces
);

$replaces = array (
  '', // remove
  '', // remove
  '', // remove
  ' ' // leave only 1 space
);

$result = trim(preg_replace($patterns, $replaces, strip_tags( $data->parent_label ) ) );

.应该做您想做的一切

相关文章